Aziz Lokhandwala
Aziz Lokhandwala

Reputation: 35

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);
}

The program is my attempt to print summation of primes < n. I am getting sum = 0 every time and I am unable to fix this issue.

Upvotes: 1

Views: 1194

Answers (3)

chqrlie
chqrlie

Reputation: 144715

The reason you do not get the sum of primes is you reset the value of sum to 0 at the beginning of each iteration. sum will be 0 or the value of the n if n happens to be prime.

Note also that you should not use floating point functions in integer computations: i <= sqrt(a) should be changed to i * i <= a.

The test on a != 1 can be removed if you start the loop at a = 2.

Here is a modified version:

#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;
}

For large values of n, a much more efficient approach would use an array and perform a Sieve of Eratosthenes, a remarkable greek polymath, chief librarian of the Library of Alexandria who was the first to compute the circumference of the earth, 2300 years ago.

Here is an improved version:

#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;
}

Upvotes: 2

nkvns
nkvns

Reputation: 600

Error about sum getting set to zero inside the loop has been already pointed out in previous answers

In current form also, your code will not return zero always. It will return zero if value of upper bound is given as non prime number. If prime number is given as upper bound, it will return that number itself as sum.

Upvotes: 1

srilakshmikanthanp
srilakshmikanthanp

Reputation: 2399

As mentioned in comment you should initialize sum before first loop something like

      int n, count, sum=0;

or you can initialize sum in the loop like

      for(a=1,sum=0;a <= n; a++)       

and remove sum=0; inside the first loop because it changes sum to 0 every time first loop executes. You can check this by inserting this lines to your code

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

make sure sure that if you are initializing sum in the loop, define "a" in outer of the loop if not the sum goes to local variable to for loop and it hides the outer sum.

Upvotes: 1

Related Questions