c语言的运行结果

#include<stdio.h>
void p(int k)
{int m,i;
for(m=2;m<=k;m++)
{for(i=2;i<=m;i++)
if(!(m%i))break;
if(i==m)printf("%4d",m);
}
printf("\n");
}
main()
{p(13);}
为什么运行答案是2 3 5 7 11 13

以上程序开始执行:
main()调用 void p() 函数,参数k=13;
for(m=2;m<=k;m++) // <1>循环m从2到13,
{for(i=2;i<=m;i++) // <2>循环i从2到m
if(!(m%i))break;
if(i==m)printf("%4d",m);
}
主要是判断: m%i为求余数,若m除以i余数为0时,!(m%i)为1,执行break,后执行if(i==m) ,
成立输出m,不成立回到<1>循环判断。若m除以i余数不为0时,!(m%i)为0,
回到<2>循环判断;
程序中只要<1>循环判断成立,都会去执行if(i==m)printf("%4d",m);
所以:m=2时; if(i==m)成立,输出2
m=3时; if(i==m)成立,输出3
m=4时; for(i=2;i<=m;i++) if(!(m%i))break;执行完i=2,if(i==m)不成立,无输出
m=5时; if(i==m)成立,输出5
m=6时; for(i=2;i<=m;i++) if(!(m%i))break;执行完i=2,if(i==m)不成立,无输出
m=7时; if(i==m)成立,输出7
m=8时; for(i=2;i<=m;i++) if(!(m%i))break;执行完i=2,if(i==m)不成立,无输出
m=9时; for(i=2;i<=m;i++) if(!(m%i))break;执行完i=3,if(i==m)不成立,无输出
m=10时;for(i=2;i<=m;i++) if(!(m%i))break;执行完i=2,if(i==m)不成立,无输出
m=11时;if(i==m)成立,输出11
m=12时;for(i=2;i<=m;i++) if(!(m%i))break;执行完i=2,if(i==m)不成立,无输出
m=13时; if(i==m)成立,输出13
固记过为: 2 3 5 7 11 13
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-02-26
#include<stdio.h>
void p(int k)
{
int m,i;
for(m=2;m<=k;m++)
{

for(i=2;i<=m;i++)//其实这里是判断m这个数是不是素数
if(!(m%i))break;//if(!(m%i))的意思是if(m%i==0)
//2 3 5 7 11 13是素数,所以答案就是你说的
if(i==m)printf("%4d",m);
}
printf("\n");
}
void main()
{
p(13);
}追问

if(!(m%i))break;//if(!(m%i))的意思是if(m%i==0)
这两个为什么会等价啊 前面不是有一个非么?不大理解

追答

!()
非是取反
如果括号是是0的话反取是1就是真的
如果括号中是真的话,取反是假.
所以应该是括号中为0的时候真,对不对啊?
所以应该是m%i==0这样就好理解了啊

追问

可是if(!(2%2))先算2%2=0 前面!变成一了就是if(1) 所以满足条件。所以break要运行。。不是么?

追答

是的啊
退出后if(i==m)i=2,m=2所以2是素数啊

相似回答
大家正在搜