正在准备计算机二级c语言的学生向大家提问

正在准备计算机二级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;

}

img

修改如下,改动处见注释,供参考:

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的素数的和了。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^