Программа для вывода суммы простых чисел в C - PullRequest
1 голос
/ 08 марта 2020
#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);
}

Программа - моя попытка напечатать суммирование простых чисел

Ответы [ 3 ]

2 голосов
/ 08 марта 2020

Причина, по которой вы не получаете сумму простых чисел, заключается в том, что вы сбрасываете значение от 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;
}
1 голос
/ 08 марта 2020

Ошибка при установке суммы в ноль внутри l oop уже указана в предыдущих ответах

В текущей форме ваш код также не всегда будет возвращать ноль. Он вернет ноль, если значение верхней границы задано как не простое число. Если простое число задано в качестве верхней границы, оно само вернет это число в виде суммы.

1 голос
/ 08 марта 2020

Как уже упоминалось в комментарии, вы должны инициализировать сумму перед первым l oop что-то вроде

      int n, count, sum=0;

или вы можете инициализировать сумму в l oop как

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

и удалить сумму = 0; внутри первого l oop, потому что он изменяет сумму на 0 каждый раз, когда выполняется первый l oop. Вы можете проверить это, вставив эти строки в ваш код

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

. Убедитесь, что если вы инициализируете сумму в l oop, определите «a» во внешнем из l oop, если нет сумма переходит в локальную переменную to для l oop и скрывает внешнюю сумму.

...