解释这个素数程序[C]

时间:2011-10-08 18:41:18

标签: c++ c

#include<stdio.h>

main()
{
    int n;

    int a,b,flag=1;
    scanf("%d",&n);

    for(a=2; a<=n; a++)
    {
        if(n % a == 0)
        {
            printf("not prime");
            flag = 0;
            break;
        }
    }

    if(flag == 1)
    {
        printf("is prime");
    }

    getch();
}

当你使用它进行循环时

for(a=2; a<=n; a++)

当用户输入2时,它将打印“not prime:

如果你将那个if(flag == 1)语句放在for循环中,当用户输入时它不会打印任何内容2.为什么if(flag == 1)在for循环之外

#include<stdio.h>
main()
{
    int i, num, flag = 1;
    scanf("%d",&num);
    for(i=2; i<=sqrt(num); i++)
    {
        if(num%i==0)
        {
            printf("not prime");
            flag=0;
            break;
        }
    }

    if(flag==1)
    {
        printf("is prime");
    }

    getch();
}

何时在for循环中使用平方根

for(i=2; i<=sqrt(num); i++)

然后它给出了正确的结果 如果你输入2那么它打印2是素数 为什么?

什么是标志变量它是如何工作的?

2 个答案:

答案 0 :(得分:3)

问题是这一行错了:

for(a=2; a<=n; a++)

应该是这样的:

for(a=2; a<n; a++)

因为n总是可以被自身整除,所以当a是n时,它将意味着n % a == 0。这意味着数字不是素数。素数可以被1和它本身整除,但没有其他整数。

当您将测试更改为a <= sqrt(num)时,您也碰巧会修复此错误。

答案 1 :(得分:1)

for(a=2; a <= n; a++)

应该是

for(a=2; a < n; a++)
         //^ difference

此外,当您使用sqrt(n)时,最好在循环外写这个以提高性能:

int m = sqrt(n); //store the result in int type
for(a=2; a <= m ; a++)

通过这种方式,您只需计算sqrt(n) ONCE,而不是每次迭代,而不是依靠编译器来优化此步骤。