繁体   English   中英

解释这个素数程序[C]

[英]explain this prime number program [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循环

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是素数为什么?

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

问题是这条线错了:

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

它应该是这样的:

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

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

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

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)而不是每次迭代sqrt(n) ,而不是依靠编译器来优化此步骤。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM