C语言 求100—200之间的全部素数,并且输出每10个换一行

#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整除,所以该合数分解得到的素因数肯定不在假设的素数集合中。因此无论该数是素数还是合数,都意味着在假设的有限个素数之外还存在着其他素数。所以原先的假设不成立。也就是说,素数有无穷多个。

参考资料来源:百度百科-质数

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-25
1. 注意 if(i>=k+1) 不在 for(i=2;i<=k;i++) 循环中,
for(i=2;i<=k;i++)
if(m%i==0)
break;

if(i>=k+1)
{
printf("%4d",m);
n=n+1;
}
当 for(i=2;i<=k;i++) 没有被 break 打断退出,那么 i 在退出循环的值为 k+1 此时 if(i>=k+1) 为真,其实 if(i>=k+1) 就是为了判断 m 是否是素数。

2 第二种写法比较对,我们先看第一种
if(i>=k+1)
{
printf("%4d",m);
n=n+1;
}

if(n%10==0)
printf("\n");
当某次循环进入 if(i>=k+1),输出了10个素数,使得n=10,进入 if(n%10==0)打印换行符;
下次循环没有进入 if(i>=k+1),但此时n还是为10,又进入了 if(n%10==0)打印换行符,此时打印多一个换行符。追问

"当 for(i=2;i=k+1) 为真,其实 if(i>=k+1) 就是为了判断 m 是否是素数。" 那为什么还要大于k+1呢?

追答

其实你也可以写成 if(i == k+1),这个可能是个人习惯,不影响程序

本回答被提问者采纳
第2个回答  2013-05-11
1. 先说:for(i=2;i<=k;i++) ,当循环正常结束时,也就是说从2到k,逐个都验证了,没强行跳出,说明没打到因数。此时,i=k+1,所以才有判断if(i>=k+1)。

2.第2种对,因为for(i=2;i<=k;i++) ,当循环正常结束时, if(i>=k+1)时才应有输出,也才涉及到是否达到10的倍数个,第1种当前素数后面紧跟的数不是素数时n的值不变,也会输出换行,会多输出换行的,虽然也是每行10个素数,但会有空白行,100-200之间素数恰好隔2个,看不出换行问题,扩大范围后就能看得出了。
有个小问题,建议改掉: k=sqrt(m);会警告,问题在于sqrt函数返回值类型要求是double型,k是整型,建议改为 k=(int)sqrt(m);追问

"此时,i=k+1,所以才有判断if(i>=k+1)。" 那为什么还要大于呢?

追答

大于是执行不到的,但测试时可以知道出了什么问题,这是个习惯。条件正确就行,你可以用if(i==k+1)

第3个回答  2013-05-11
1.程序自然结束后,会有i==k+1,此时是素数,打印数字;而如果是break出循环,则假设不成立,为合数,不打印字符,执行下一次循环。
回答追问:无论被break打断还是自然执行,下一句执行的都是if语句,如果没有if,会输出所有值。
2.都正确,是为了判断是否够10个数,够的话执行换行
第4个回答  2013-05-11
第一个问题的分析:如果满足i<=k,则说明这个数不是素数,则不用输出,不执行下面的printf的函数,只有满足i>=k+1(其实是满足1=k+1),才能判断此数为素数,则输出。所以程序是正确的。
第二个问题的分析:两个程序的最终结果是一样的,都是正确的。