Причина, по которой вы не получаете сумму простых чисел, заключается в том, что вы сбрасываете значение от sum
до 0
в начале каждой итерации. sum
будет 0
или значение n
, если n
окажется простым.
Обратите также внимание, что вы не должны использовать функции с плавающей запятой в целочисленных вычислениях: i <= sqrt(a)
должно быть изменено на i * i <= a
.
Тест на a != 1
можно удалить, если запустить l oop с a = 2
.
Вот измененная версия:
#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
гораздо более эффективный подход будет использовать массив и выполнить Сито из Эратосфен , замечательный греческий эрудит, главный библиотекарь Александрийская библиотека, которая первой вычислила окружность земли, 2300 лет go.
Вот улучшенная версия:
#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;
}