Функция принтера простых чисел, вылетает при передаче достаточно больших чисел - PullRequest
0 голосов
/ 04 сентября 2011

У меня есть этот фрагмент кода, который будет печатать простые числа до экрана.

Например, printPrimes (500000) будет заполнять экран всеми простыми числами до 500000-го (который7368787).

Проблема в том, что передача большего числа, например 600000 или 1000000, приведет к поломке программы.

Есть идеи?Заранее спасибо.

typedef enum {false, true} bool;

bool isPrime(long number, long primes[], long n) {
    int divisor, index;
    for (index = 0; index < n; ++index) {
        divisor = primes[index];
        if (divisor * divisor > number) {
            return true;
        } else if (number % divisor == 0) {
            return false;
        }
    }
    return 0;
}

void printPrimes(long n) {
    long primes[n];
    long odd, index;
    primes[0] = 2;
    odd = 1;
    index = 1;
    while (index < n) {
        odd += 2;
        if (isPrime(odd, primes, n)) {
            printf("%ld ", odd);
            primes[index] = odd;
            ++index;
        }
    }

}

1 Ответ

6 голосов
/ 04 сентября 2011

Здесь:

long primes[n];

Вы переполняете стек, если n достаточно велик (стек довольно мал). Попробуйте вместо этого использовать malloc.

long *primes = malloc(sizeof(*primes) * n);
...