正在准备计算机二级c语言的学生向大家提
double fun(int n)
{int i,a;double sum=0;
for(i=3;i<=n;i=i+2)
for(a=2;a<(int)sqrt(i);a++)
{if(i%a==0)
break;
}
sum+=i;
return sum;
}
我写的这个代码为什么不能求出从3到n的素数的和?
正在准备计算机二级c语言的学生向大家提
double fun(int n)
{int i,a;double sum=0;
for(i=3;i<=n;i=i+2)
for(a=2;a<(int)sqrt(i);a++)
{if(i%a==0)
break;
}
sum+=i;
return sum;
}
我写的这个代码为什么不能求出从3到n的素数的和?
因为计算素数和的表达式放在了两个for循环外面,所以sum的值为for循环结束后i的值;
然后for循环内,可以使用一个标志来记录区间的数是否可以整除i,当第二个for循环结束后,再根据这个标志是否为1(即是否是素数),来决定是否累加到和sum中,然后两个for循环结束,即可计算出3到n之间素数和。
修改如下:
#include <stdio.h>
#include <math.h>
double fun(int n) {
int i,a;
double sum=0;
int prime;
for(i=3; i<=n; i=i+2){
prime=1; // 素数标志,默认1表示当前的数为素数
for(a=2; a<=(int)sqrt(i); a++) {
if(i%a==0){ // 如果区间任意一个数可以整除 i,则i不是素数,素数标志置0
prime=0;
break;
}
}
if(prime==1){ // 如果当前数是素数,则累加到和sum中
sum+=i;
}
}
return sum;
}
int main(void) {
int n;
scanf("%d",&n);
printf("3到%d之间的素数和为:%.0f\n",n,fun(n));
return 0;
}