在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
将是 0
或 n
的值。
另请注意,您不应在整数计算中使用浮点函数: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;
}
#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
将是 0
或 n
的值。
另请注意,您不应在整数计算中使用浮点函数: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;
}