#include
void main()
{
int n,s=0,sum=0,flag=1,x;//flag没有初始值
for(n=2;n<=1000;n++)
{
for(x=2;x<=n-1;x++)
{ //最好用括号括起来
if(n%x==0)
{
flag=0;
break; //能整除就可以中止内层循环了
}
else
flag=1;
}//最好用括号括起来
if(flag==1)//这儿是判断==,不是赋值
{
s++;
sum=sum+n;
}
}
printf("sum=%d\ns=%d\n",sum,s);
}
逻辑问题···
1:你的if··else完全不符合规范··内层循环建议你用大括号括起来·不管是不是只运行一行代码··
2:内层循环不断的在遍历直到最后一个数··flag也在循环里不断的改变值·不仅耗时而且会出逻辑错误··比方说非素数6·你循环2到5··最终5还是走的else·你岂不是flag仍然为真·最后将非素数也加进去了么·
建议:内层循环你需要达到的目的是通过遍历判断能否被整除,所以你应该只设置一个判断如果能被整除标志位flag为0··马上break出来··不再循环·
希望能对你有帮助
#include
void main() {
int n, s = 0, sum = 0, flag, x;
for (n = 2; n <= 1000; n++) {
flag = 1; // 假设每个数刚开始都是素数,用你的方法,2不是素数。
for (x = 2; x <= n - 1; x++)
if (n % x == 0){
flag = 0;
break; //如果不是素数马上退出
}
//else
//flag = 1;
if (flag == 1) { //= 改为 ==
s++;
sum = sum + n;
printf("%d\n",n);
}
}
printf("sum=%d\ns=%d\n", sum, s);
}
首先 你2就没有算进去 n=2的时候 x也是2 循环进不去 flag是0 就不加2了