C编程:使用关系运算符 - 小于vs小于等于

时间:2017-01-05 13:20:53

标签: c for-loop relational-operators

我正在处理教科书问题,我在下面编写了这段代码,以识别用户输入的正数以下的所有素数:

#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 . . .

现在,素数不再打印,但我想不出任何合乎逻辑的原因。我的脑子现在因为想到为什么它应该有效而可能会受到伤害。请帮忙。谢谢!

我在codeblocks 16.01和Visual Studio Community 2015上试过这个。输出是一样的。

1 个答案:

答案 0 :(得分:3)

代码中存在逻辑错误

我们知道素数是一个除以1或其自身的数字

当您执行for (j = 2; j < input; j++)时,请检查下面的所有数字,而不是input这是正确的。

但是,当您for (j = 2; j <= input; j++)时,请检查input

由于每次都会将(input % j) == 0每个数字除以notaprime = 1;,因此无法生成输出