在C中打印素数和的程序

Program to print sum of primes in C

#include <stdio.h>
#include <math.h>

int main() {
    int n, count, sum;
    printf("Enter upper bound n \n");
    scanf("%d", &n);
    for (int a = 1; a <= n; a++) {
        count = 0;
        sum = 0;
        for (int i = 2; i <= sqrt(a); ++i) {
            if (a % i == 0) {
                count++;
                break;
            }
        }
        if (count == 0 && a != 1) {
            sum = a + sum;
        }
    }
    printf("%d", sum);
}

该程序是我尝试打印素数 < n 的总和。我每次都得到 sum = 0,我无法解决这个问题。

如评论中所述,您应该在第一次循环之前初始化总和,例如

      int n, count, sum=0;

或者你可以像

这样在循环中初始化 sum
      for(a=1,sum=0;a <= n; a++)       

并删除 sum=0;在第一个循环内,因为每次执行第一个循环时它都会将 sum 更改为 0。您可以通过将此行插入您的代码来检查这一点

    printf("Before sum %d",sum);
    sum = 0;
    printf("After  Sum %d",sum);

确保如果您在循环中初始化总和,则在循环外部定义 "a" 否则总和将转到局部变量以进行 for 循环并隐藏外部总和。

在之前的回答中已经指出了在循环内将总和设置为零的错误

在当前形式中,您的代码也不会 return 始终为零。如果上限值作为非质数给出,它将 return 为零。如果素数作为上限给出,它将return那个数字本身作为总和。

你没有得到质数和的原因是你在每次迭代开始时将 sum 的值重置为 0。如果 n 恰好是质数,sum 将是 0n 的值。

另请注意,您不应在整数计算中使用浮点函数:i <= sqrt(a) 应更改为 i * i <= a

如果在 a = 2 处开始循环,则可以删除 a != 1 上的测试。

这是修改后的版本:

#include <stdio.h>

int main() {
    int n = 0, sum = 0;
    printf("Enter upper bound n: \n");
    scanf("%d", &n);
    // special case 2
    if (n >= 2) {
        sum += 2;
    }
    // only test odd numbers and divisors
    for (int a = 3; a <= n; a += 2) {
        sum += a;
        for (int i = 3; i * i <= a; i += 2) {
            if (a % i == 0) {
                sum -= a;
                break;
            }
        }
    }
    printf("%d\n", sum);
    return 0;
}

对于较大的 n 值,更有效的方法是使用数组并执行 Sieve of Eratosthenes,一位非凡的希腊博学家,亚历山大图书馆的首席图书管理员,他是第一个计算2300年前地球的周长。

这是一个改进的版本:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int n = 0;
    long long sum = 0;

    if (argc > 1) {
        sscanf(argv[1], "%i", &n);
    } else {
        printf("Enter upper bound n: \n");
        scanf("%i", &n);
    }
    // special case 2
    if (n >= 2) {
        sum += 2;
    }
    unsigned char *p = calloc(n, 1);
    for (int a = 3; a * a <= n; a += 2) {
        for (int b = a * a; b < n; b += a + a) {
            p[b] = 1;
        }
    }
    for (int b = 3; b < n; b += 2) {
        sum += p[b] * b;
    }
    free(p);
    printf("%lld\n", sum);
    return 0;
}