#include<math.h>
main()
{
int m,i,k,n=0;
for(m=101;m<=200;m++,m++)
{
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)
break;
if(i>=k+1)
{
printf("%4d",m);
n=n+1;
}
if(n%10==0)
printf("\n");
}
printf("\n");
}
#include<math.h>
main()
{
int m,i,k,n=0;
for(m=101;m<=200;m++,m++)
{
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)
break;
if(i>=k+1)
{
printf("%4d",m);
n=n+1;
if(n%10==0)
printf("\n");
}
}
printf("\n");
}
请问:1.以上上判定素数中,“for(i=2;i<=k;i++)“那么怎么会有下面if(i>=k+1)呢?i不是永远<=k的么?
2. 以上两种写法哪个正确啊。if(n%10==0)是做为 if(i>=k+1)的循环,还是做为for(m=101;m<=200;m++,m++)的循环呢?
第一个问题的分析:如果满足i<=k,则说明这个数不是素数,则不用输出,不执行下面的printf的函数,只有满足i>=k+1(其实是满足1=k+1),才能判断此数为素数,则输出。所以程序是正确的。
第二个问题的分析:两个程序的最终结果是一样的,都是正确的。
程序自然结束后,会有i==k+1,此时是素数,打印数字;而如果是break出循环,则假设不成立,为合数,不打印字符,执行下一次循环。
扩展资料:
如果 为合数,因为任何一个合数都可以分解为几个素数的积;而N和N+1的最大公约数是1,所以不可能被p1,p2,……,pn整除,所以该合数分解得到的素因数肯定不在假设的素数集合中。因此无论该数是素数还是合数,都意味着在假设的有限个素数之外还存在着其他素数。所以原先的假设不成立。也就是说,素数有无穷多个。
参考资料来源:百度百科-质数
"当 for(i=2;i=k+1) 为真,其实 if(i>=k+1) 就是为了判断 m 是否是素数。" 那为什么还要大于k+1呢?
追答其实你也可以写成 if(i == k+1),这个可能是个人习惯,不影响程序
本回答被提问者采纳"此时,i=k+1,所以才有判断if(i>=k+1)。" 那为什么还要大于呢?
追答大于是执行不到的,但测试时可以知道出了什么问题,这是个习惯。条件正确就行,你可以用if(i==k+1)