解释这个素数程序[C]

explain this prime number program [C]

本文关键字:程序 解释      更新时间:2023-10-16
#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 时,它将打印"不是素数:

如果将该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。这并不意味着这个数字不是素数。素数正好可以被 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),而不是在每次迭代中计算,而不是依赖编译器来优化此步骤。