初学C语言的困惑,求1到100素数的合

#include<stdio.h>
main()
{ int i,j,s;
for(i=2,;i<=100;i++)
{ for(j=2;j<=i-1;j++)
if(i%j==0)break;
if(j>i-1)
s=s+i;
}
printf("%d\n",s);
}
能帮我具体分析下吗?

#include<stdio.h>
void main()
{ int i,j,s=0;
for(i=2;i<=100;i++)//从2--100中筛选素数
{
for(j=2;j<=i-1;j++)//判断方法,用要判断的数 除以 从 2到要判断的数,如果能被某个数整除即取余为0;
//即这个数不是素数,j的结束条件为j>i-1;
if(i%j==0)break;//取余为0了,说明i不是素数,跳出循环,不用累加到s中
if(j>i-1)//判断i是结束跳出还是中间跳出(break产生的),若是结束跳出来的,i是素数,累加到s
s=s+i;
}
printf("%d\n",s);//输出所有素数累加和
}
可以参考下面方法:
#include<iostream.h>
#include<math.h>
bool is_prime(int num)//判断一个数是否是素数
{
if(num<=1) return false;
int ncount=(int)sqrt(num);
for(int i=2;i<=ncount;i++)
if(num%i==0) break;
return i>ncount?true:false;
}
int sum(int src,int dest)//求从src到dest所有中素数的和
{
if(dest<src) return 0;
int sum=0;
for(int i=src;i<=dest;i++)
{
if(is_prime(i))
sum+=i;
}
return sum;
}
void main()
{
cout<<sum(1,100)<<endl;
}追问

if(j>i-1)这个判断没搞清楚 没有这个判断 行吗

追答

不行啊,if(j>i-1)主要就是区分是正常结束跳出的啊,还是中间break的啊,中间break的说明不是素数的时候跳出的...

追问

额,我没搞懂 if(j>i-1)这个判断......为什么是就j>i-1,不能是其他吗?难道是因为上面那个FOR循环里面的j<=i-1?

追答

是的。这个for的循环区间[2,i-1], 当j=i时for正常结束跳出。因此你也可以用if(j==i)来判断是否是正常结束跳出的的。

追问

if(j>i-1)这句话只是判断是否执行下面的s=s+i吧?我把if(j>i-1)改为else可行吗?

追答

是的。不能改为else ,为什么呢?看下面,i第一个if是for循环体中的内容,如果第二个if改为else和那个if配对啊。
for(j=2;ji-1;
{
if(i%j==0)break;//取余为0了,说明i不是素数,跳出循环,不用累加到s中
}
if(j>i-1)//正常结束跳出来的,i是素数,执行下面一句,累加到s,否则什么也不做。
s=s+i;

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-08-14
#include<stdio.h>
void main()
{ int i,j,s=0; //s初始化
for(i=2;i<=100;i++) //这里多了,
{ for(j=2;j<=i-1;j++)
if(i%j==0)break;
if(j>i-1)
{s=s+i;
printf("%d ",i); //验证结果,可不加
}
}
printf("%d\n",s);
}本回答被网友采纳
第2个回答  2012-08-14
#include<stdio.h>
#include<math.h>
void main()
{
int sum=0;
int i,j;
int flag=0;//flag=0说明是素数,为1是合数
for(i=2;i<=100;i++)
{
for(j=2;j<=sqrt(i);j++)
{
if(i%j==0)
{
flag=1;
break;
}
}
if(flag == 0)
{
printf("%d ",i);
sum+=i;
}
else
flag=0;
}
printf("\n%d\n",sum);
}
相似回答