(С#) Как работает цикл for в конкретном примере?

Помогите разобраться в этом "простом примере" из Шилдта

// Простой пример применения параметра. 

using System;
class ChkNum
{

    // Возвратить значение true, если значение 
    // параметра х окажется простым числом. 

    public bool IsPrime(int x)
    {
        if (x <= 1) return false;
        for (int i = 2; i <= x / i; i++)
            if ((x % i) == 0) return false;
        return true;
    }
}
class ParmDemo
{
    static void Main()
    {
        ChkNum ob = new ChkNum();
        for (int i = 2; i < 10; i++)
            if (ob.IsPrime(i)) Console.WriteLine(i + " простое число.");
            else Console.WriteLine(i + " непростое число.");
    }
}

Вот какой результат дает выполнение этой программы.
2 простое число.
3 простое число.
4 непростое число.
5 простое число.
6 непростое число.
7 простое число.
8 непростое число.
9 непростое число.

сначала идет цикл For из класса parmdemo и он передает начальное значение 2 в IsPrime который использует его как X
далее начинается проверка, X>1 и return не срабатывает
потом начинается цикл for (int i=2; i <= x/i; i++)
и я никак не могу понять как цикл выполняется, если i <= x/i !!!!
получается 2<=2/2 или 2<=1
что за бред
по идее при таком условии цикл вообще не должен исполняться

идем далее, начинается условие if
у нас x=2, i тоже равна 2, получается 2/2 число делится без остатка, то есть условие if((x %i) == 0) выполняется
и если if((x %i) == 0) return false; то значение false передается в
if(ob.IsPrime(i)) Console.WriteLine(i + " простое число.");
else Console.WriteLine(i + " непростое число.");

if(ob.IsPrime(i)) можно интерпретировать как if(ob.IsPrime(i)==true), но у нас ведь передалось значение false, значит выполняется следующая строка else Console.WriteLine(i + " непростое число.");
но это ведь не так и 2 это простое число!

Объясните пожалуйста!
  • Вопрос задан
  • 167 просмотров
Решения вопроса 1
тут же проверка на простые числа. Простое число — это натуральное число, большее единицы, имеющее ровно два натуральных делителя: 1 и само себя. Берем 2. Смотрим на код.
for (int i = 2; i <= x / i; i++)
            if ((x % i) == 0) return false;
        return true;

Да, верно вы сказали, цикл на выполнится, то есть не выполнится строка с If, программа "перескочит" сразу на ретёрн true. То есть - да, 2 это простое число! Т.е. ob.IsPrime(i)) вернёт True.

Главное, что вы сами ответили на свой вопрос. Условие останова в цикле for не даст ни одной итерации, вернётся true! Попробуйте выполнить программу пошагово (в VS, кажется, ставите точку останова а далее клавишей f11) и вы это увидите сами.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@cicatrix
было бы большой ошибкой думать
При x=2:
if (x <= 1) return false;
for (int i = 2; i <= x / i; i++) //   2 > 1 - следующая строка не выолнится
    if ((x % i) == 0) return false;
return true;
Ответ написан
freeExec
@freeExec
Участник OpenStreetMap
Так цикл и не выполняется, сразу за ним возвращается ДА.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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