Simpelax
@Simpelax
Нищий студент

В каком порядке инкрементируется переменная в циклах Java?

Доброго времени суток и с новым годом!
Я сломал себе голову задачкой по поиску простых чисел, нашел алгоритм, но сдавать его без понимания не хочу, поэтому прошу помощи у Вас.

for(int i = 2; i <= 100; i++){
            boolean isPrime = true;
            for(int j = 2; j < i; j++){
                if(i % j == 0){
                    isPrime = false;
                    break;
                }
            }
            if(isPrime){

                System.out.printf(String.valueOf(i) + " ");
            }
        }


Вот два цикла, с проверкой на остаток на деление, но я не могу разобраться - в каком порядке инкрементируются переменные для деления без остатка?

На первой итерации внешнего цикла во вложенном производится деление 2 на 2 с остатком 0 условие выполняется, срабатывает break, обрывается итерация во внешнем цикле (?) и инкрементируется переменная i, а j нет? Мой мозг прям упорно сопротивляется придти к логике при попытке просчета нескольких итераций дальше, помогите пожалуйста прояснить момент.
  • Вопрос задан
  • 84 просмотра
Решения вопроса 1
@eandr_67
web-программист (*AMP, Go, JavaScript, вёрстка).
На каждой итерации внешнего цикла внутренний цикл начинается заново - с создания переменной j, инициализации её значением 2 и т.д.

При выполнении break прекращается только внутренний цикл. Внешний как выполнялся, так и продолжает выполняться - пока значение i не достигнет 100.

С точно тем же результатом внутренний цикл можно было бы записать без break:
for(int j = 2; isPrime && j < i; j++) { isPrime = i % j != 0; }

P.S. А алгоритм, мягко говоря, не блещет. Банальное решето Эратосфена намного эффективнее:
boolean[] arr = new boolean[100];
for(int i = 2; i < 100; ++i) {
  if (arr[i]) { continue; }
  for (int j = i * i; j < 100; j += i) { arr[j] = true; }
  System.out.print(i);
  System.out.print(' ');
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы