#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是素数 为什么?
什么是标志变量它是如何工作的?
答案 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,而不是每次迭代,而不是依靠编译器来优化此步骤。