A для цикла
for (INIT; CONDITION; NEXT) {
BODY;
}
эквивалентно циклу while
{
INIT;
while (CONDITION) {
BODY;
NEXT;
}
}
(за исключением того, что цикл for не позволяет объявлять одно и то же имя в INIT
и во внешнем блоке BODY
).
Вы допустили пару ошибок при конвертации:
- Синтаксис
do { BODY; } while (CONDITION);
всегда выполняет BODY
хотя бы один раз. Исходный цикл for
может не выполняться.
Это имеет значение для случая i==2
: в исходном коде внутренний цикл for
установит j=2
, а затем сразу же проверит, является ли j<=i/2
, что равно 2<=1
, или ложно, поэтому тело цикла выиграло не выполняется вообще. Но ваш код начинается с установки i=2; j=2;
, а затем идет прямо к тесту коэффициента if (i%j == 0)
. Это правда, поэтому он неправильно заключает, что 2
не является простым числом.
- Вы переместили операторы
isPrime = 1;
и printf
из внешнего цикла на i
, чтобы быть внутри внутреннего цикла на j
. Это плохо изменяет поведение программы.
Рассмотрим, что происходит, когда i==15
: мы начинаем с j=2
и обнаруживаем, что i%j != 0
, поскольку 2
не является фактором 15
. Таким образом, он устанавливает isPrime = 1;
и печатает 15
. Внутренний цикл продолжается, установив j=3
. На этот раз i%j == 0
, поскольку 3
имеет коэффициент 15
, поэтому он устанавливает isPrime = 0;
и ничего не печатает. Внутренний цикл повторяется с j=4
. Теперь он вернулся к i%j != 0
, поэтому устанавливает isPrime = 1;
и печатает 15
снова. Это продолжается до j=7
, печатая 15
всего четыре раза (когда j
равно 2, 4, 6 и 7).
Я оставлю это вам, чтобы посмотреть, сможете ли вы исправить код, используя while
loop.