2 lhc18 LHC18 于 2013.10.28 18:25 提问

求解释啊~~~ 又不明白了。。

#include #include main() { int a,b,c; c=0; for(a=100;a<=200;a++) { for(b=2;b<=a-1;b++) if(a%b==0) break; if(a==b) printf("素数为:%d\n",a); c++; } system("pause"); } break的意思不是跳出循环进行下一步吗? 这样的话输出的岂不都是合数了? 还有那个 if(a==b)需要吗? 既然b<=a-1了,怎么会等于呢? 但是取消了输出的又不对,搞不懂了~ 求解答~~

2个回答

bdxk1992
bdxk1992   2013.10.28 19:16

外面的循环是表示你要查询是否是素数的范围是100到200,内层循环表示你在逐个试除以验证当前查询的数a是否存在非1的约数,分析代码可以知道,程序跳出内层循环的条件有两个,第一种就是你检测到这个数有非1约数,那么表示这个数不是素数,这时候触发break跳出循环,第二种就是你内层循环所有的可能都试过了,说明这个数没有非1约数,因此它是素数。那么既然不管它是否是素数,都会跳出循环,所以就需要加以判断。容易看出,两者虽然都会跳出内层循环,但是两种情况中a和b的大小关系是不一样的,因为第一种情况是在中途跳出的,因此b必然还小于a,第二种情况是在所有情况都试过之后跳出,因此必然a等于b(因为当b==a-1时候,发现还是不能整除,因此在进入下一次循环之前b++,这个时候b==a,然后再下一次循环开始前在执行判断语句是否b<=a-1,显然不符合,所以跳出,此时b保持等于a的状态),因此就可以根据退出内层循环后a和b的大小关系来判断a是否是素数。

LHC18
LHC18 谢谢耶~~
4 年多之前 回复
u012555162
u012555162   2013.10.28 20:28

我也是一位初学者,我当时也为这件事思考过,我是这么理解的,因为for(b=2;b<=a-1;b++) 循环是在第一个分号结束的。而他的第一个分号是if语句,if语句中同时包括了break从句,所以,break从句将这个for循环给结束了,而for(a=100;a<=200;a++)它确可以继续进行。比如当a=100时,此时b=2,break中断程序,继续执行,a=101,此时b从2继续循环。我的观点不知否正确,望其他楼主点评。

LHC18
LHC18 恩恩 差不多啦 谢谢 明白了
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!