Программирование на C: использование реляционных операторов - меньше чем равно меньше чем равно

Я работаю над проблемой из учебника, и я написал этот фрагмент кода ниже, чтобы определить все простые числа под введенным пользователем положительным числом:

#include <stdio.h>

int main(void)
{
    int j, input, notaprime;

    scanf_s("%d", &input);

    printf("List of prime numbers:\n");
    for (; input >= 2; input--)
    {
        notaprime = 0;
        for (j = 2; j < input; j++) //OR (for(j = 2; j*j <= input; j++)
        {
            if ((input % j) == 0)
            {
                notaprime = 1;
                break;
            }
            else
            {
                ;
            }
        }

        if (notaprime)
        {
            ;
        }
        else
        {
            printf("%d\n", input);
        }
    }

    return 0;
}

Когда 30 вводится как ввод, следующий вывод:

30
List of prime numbers:
29
23
19
17
13
11
7
5
3
2
Press any key to continue . . .

Однако, когда я изменяю реляционный оператор во внутреннем цикле for с:

        for (j = 2; j < input; j++)

чтобы:

        for (j = 2; j <= input; j++) //Changed from less than to less than equals

Следующее становится выводом входного значения 30:

30
List of prime numbers:
Press any key to continue . . .

Теперь простые числа больше не печатаются, но я не могу придумать ни одной логической причины, почему это так. Мой мозг болит сейчас от размышлений о возможных причинах, почему это должно быть справедливо. Пожалуйста помоги. Спасибо!

Я пробовал это на кодовых блоках 16.01 и Visual Studio Community 2015. Вывод тот же.

1 ответ

Решение

В вашем коде есть логическая ошибка

Мы знаем, что простое число - это число, которое делится на 1 или само по себе.

когда вы делаете for (j = 2; j < input; j++) тогда вы проверите все номера ниже, чем input что правильно.

Но когда вы делаете for (j = 2; j <= input; j++) Вы проверяете до input,

Так как каждое число делится само по себе (input % j) == 0 каждый раз, notaprime = 1; оценка истинна, следовательно, не выводится

Другие вопросы по тегам