正在准备计算机二级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;
}
修改如下,改动处见注释,供参考:
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++) // 修改 a < (int)sqrt(i);
{
if (i % a == 0)
break;
}
if (a > (int)sqrt(i)) // 修改
sum += i;
}// 修改 少了 '}'
return sum;
}
【以下回答由 GPT 生成】
问题分析: 该代码中存在两个问题: 1. 变量sum
放在了循环外部,导致循环结束后只计算了最后一个素数的值,而不是所有素数的和 2. 内层循环的判断条件有误,应为a <= (int)sqrt(i)
而不是a < (int)sqrt(i)
,使得循环无法正确地判断是否为素数
解决方案: 针对以上问题,可以做如下修改: 1. 把变量sum
放到内层循环中,每判断一个素数就进行累加,确保每次都计算素数的值并进行累加操作 2. 修改内层循环的判断条件为a <= (int)sqrt(i)
,确保循环能正确判断是否为素数
修改后的代码如下:
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;
}
if(a > (int)sqrt(i))
{
sum += i;
}
}
return sum;
}
这样修改之后,代码就能正确求出从3到n的素数的和了。
【相关推荐】