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

#include<math.h>main(){intm,i,k,n=0;for(m=101;m<=200;m++,m++){k=sqrt(m);for(i=2;i<=k;... #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++)的循环呢?
展开
 我来答
帐号已注销
2021-01-03 · TA获得超过77.1万个赞
知道小有建树答主
回答量:4168
采纳率:93%
帮助的人:167万
展开全部

第一个问题的分析:如果满足i<=k,则说明这个数不是素数,则不用输出,不执行下面的printf的函数,只有满足i>=k+1(其实是满足1=k+1),才能判断此数为素数,则输出。所以程序是正确的。

第二个问题的分析:两个程序的最终结果是一样的,都是正确的。

程序自然结束后,会有i==k+1,此时是素数,打印数字;而如果是break出循环,则假设不成立,为合数,不打印字符,执行下一次循环。

扩展资料:

如果 为合数,因为任何一个合数都可以分解为几个素数的积;而N和N+1的最大公约数是1,所以不可能被p1,p2,……,pn整除,所以该合数分解得到的素因数肯定不在假设的素数集合中。因此无论该数是素数还是合数,都意味着在假设的有限个素数之外还存在着其他素数。所以原先的假设不成立。也就是说,素数有无穷多个。

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

焦拱
推荐于2017-11-25
知道答主
回答量:8
采纳率:0%
帮助的人:14.4万
展开全部
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),这个可能是个人习惯,不影响程序
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友f3b3e02
2013-05-11 · TA获得超过2156个赞
知道小有建树答主
回答量:821
采纳率:90%
帮助的人:584万
展开全部
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)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
奇文3H
2013-05-11
知道答主
回答量:8
采纳率:0%
帮助的人:3.7万
展开全部
1.程序自然结束后,会有i==k+1,此时是素数,打印数字;而如果是break出循环,则假设不成立,为合数,不打印字符,执行下一次循环。
回答追问:无论被break打断还是自然执行,下一句执行的都是if语句,如果没有if,会输出所有值。
2.都正确,是为了判断是否够10个数,够的话执行换行
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友387db40
2013-05-11 · 超过17用户采纳过TA的回答
知道答主
回答量:95
采纳率:0%
帮助的人:49.2万
展开全部
第一个问题的分析:如果满足i<=k,则说明这个数不是素数,则不用输出,不执行下面的printf的函数,只有满足i>=k+1(其实是满足1=k+1),才能判断此数为素数,则输出。所以程序是正确的。
第二个问题的分析:两个程序的最终结果是一样的,都是正确的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式