Давайте сосредоточимся на этих for
петлях.
for(i=2; i < 100; i++) {
isprime = true;
for (j=2; j <= i/j; j++)
if((i%j) == О) isprime = false;
if (isprime)
System.out.println(i +" - is a prime number.");
}
Первый цикл повторяет все числа, которые вы хотите проверить. Достаточно легко понять, он просто говорит: «Я хочу выполнить следующий тест для всех чисел от 2 до 100».
for (j=2; j <= i/j; j++)
if((i%j) == О) isprime = false;
Теперь этот цикл - чистая математика.
Математически, простое число:
- натуральное число больше 1, которое не может быть образовано
умножение двух меньших натуральных чисел.
(источник: Википедия)
Поэтому вы перебираете все числа, которые при умножении образуют i.
Но вам действительно нужно?
Если, например, i = 3 * 25, нужно ли вам итерировать до 25, чтобы узнать, что я не простое число?
Ответ, очевидно, нет, так как после проверки на j = 3 вы уже знаете, что я составной.
Математически существует несколько алгоритмов для проверки, является ли число простым или составным. Но разумно правильный способ сделать это - проверить, является ли число кратным любого числа от 2 до его собственного квадратного корня . Вы выполняете округленную версию этого.
Проверка всех чисел от 2 до i избыточна по причинам, указанным выше.
РЕДАКТИРОВАТЬ: Ответ на 2)
При использовании
for (j=2; j <= i; j++)
if((i%j) == 0) isprime = false;
вы говорите компилятору прекратить цикл после выполнения теста на j==i
. Конечно, когда j равно i, (i% j) == 0 всегда принимает значение true.
В неинформативных терминах вы проверяете, состоит ли число из любого числа, кроме 1, включая саму себя , тогда как вам следует проверять, состоит ли оно из любого числа, кроме 1 и сам .
Это связано с тем, что в Java реализованы циклы for
: они останавливаются, когда среднее условие оценивается как ложное.