C语言求答案与解析 谢谢!

第一个是记错的

答案是第一个空 i 或者a[i], 第二个空a[i], 第三个空是0;
在这个程序中,他的实现逻辑是,先把这个数组a填上值,也就是这一句
for(i = 2; i <= n; i ++)
a[i] = i;
之后,从初始值2,第一轮循环是,将2以及2的倍数都将其改为0,这样就间接的实现将2以及2的倍数都删掉的效果了,问题来了,怎么去实现2以及2的倍数都等于0,这就用到了这个循环
for(j = a[i] * 2; j <= n; j += a[i])
a[j] = 0;
首先让初始值为2,也就是这一句j = a[i] * 2,而2的倍数则是每次加一个2就行,在这里 i 和a[i] 都等于2(前面给数组赋值语句的时候给的值),所以这里是 让j 每次都加上 i 或者 a[i] 就行。
执行完这一句之后,让i ++, 这时候 i 就等于3 ,同上所诉,就会继续3以及3的倍数的操作了。
如果只是这么做得话,会有一个问题,就是你前面对2的倍数进行清0操作的时候,那些相应的位置就会变成0,比如说 a[4], 这时候就变成了0,然后在你的循环执行到4以及4的倍数的时候,你就会发现你的for循环变成了一个死循环,因为j 会一直在自加 0,永远不会大于n,必然是死循环,所以就有了下面while(a[i] == 0) i++;这一句,也就是如果a[4]等于0.就不执行4以及4的倍数的操作,直接跳到5的倍数的操作。
最后一个空就是打印了,你只是想打印素数,但是里面还有一些0,所以遇到0就不打印,不是0就打印。
大概就是这些了。不明白继续追问!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-08-17
a[i]
a[i]
0追问

分析程序可以吗?谢谢

相似回答