вторник, 4 августа 2015 г.

Продолжая изучать книгу H. Shildtа "java a beginner's guide".

Нашел интересную ошибку в ответах к упражнениям для самопроверки по материалу главы 2. Упражнение № 10 "Напишите программу, которая бы находила простые числа в пределах от 2 до 100".
Простое число - это натуральное (целое положительное) число, имеющее ровно два различных натуральных делителя. Другими словами, число простое, если оно больше и делится без остатка только на и на .(Википедия). Если говорить еще проще, то простое число 3, например, делится нацело только на 3 и на 1, а если поделить его на 2, то получится 1.5(полтора), то есть с остатком 0.5.

Вот код программы, который предлагают в ответах:

public class Prime {
    public static void main(String args[]) {
        int i, j;
        boolean isprime;
        for (i = 2; i < 1000; i++) {
            isprime = true;
            // Проверить делится ли число без остатка            for (j = 2; j < i/j; j++)
                // если число делится без остатка значит оно простое            if ((i % j) == 0) isprime = false;
            if (isprime)
                System.out.println(i + " is prime.");
        }
    }
}

После того, как я скомпилировал программу, в консоль вывелись не только простые числа, но и составные. Такие как "4", "9", "25", "49" и другие. Долгое время не мог понять, что значит строка кода цикла for (j = 2; j < i/j; j++). Но, немного подумав, решил исправить её на следующую for (j = 2; j < i; j++). И программа заработала как следует. 

public class Prime {
    public static void main(String args[]) {
        int i, j;
        boolean isprime;
        for (i = 2; i < 50; i++) {
            isprime = true;
            // Проверить делится ли число без остатка            for (j = 2; j < i; j++)
                // если число делится без остатка значит оно простое            if ((i % j) == 0) isprime = false;
            if (isprime)
                System.out.println(i + " is prime.");
        }
    }
}

3 комментария:

  1. Я как ни пытался - не понял как этот цикл работает, сам в итоге такой код написал:
    class rara {
    public static void main(String args[]) {
    int x;
    boolean prost;
    for(x = 2; x <= 100; x++) {
    prost = true;
    if((((x%2) == 0) & (x != 2))
    | (((x%3) == 0) & (x != 3))
    | (((x%5) == 0) & (x != 5))
    | (((x%7) == 0) & (x != 7))) prost = false;
    if(prost)
    System.out.println(x + " простое");
    }
    }
    }

    ОтветитьУдалить
  2. не проще ли вот так
    // Найти простые числа от 2 до 100.

    public class ProstieChisla {
    public static void main(String[] args) {
    int i;

    for(i=2;i<=100;i++){
    if(i==2|i==3|i==5|i==7){
    System.out.println(i);
    }else if ((i%2)!=0&(i%3)!=0&(i%5)!=0&(i%7)!=0){
    System.out.println(i);
    }
    }
    }
    }

    ОтветитьУдалить