制作大桌子时程序停止工作(2' 000' 000+)

时间:2014-01-19 21:22:43

标签: c++ arrays runtime-error primes

我用Eratosthenes的Sieve编写了这个程序。它应该输出高达2'500'000的素数,但是当试图创建大于~2'100'000的数组时它会崩溃。什么想法可能会被打破?

在Code :: Blocks中使用gcc进行编译(Windows 8.1,对我很羞耻)。

PS对于N <= 2'000'000

,它完美无缺
#include <stdio.h>

int main() {
    // Input
    long n;
    scanf("%ld", &n);

    // Initialize vars
    bool number[n+1];
    for(long i = 0; i < n; i++)
        number[i] = false;

    // Main loop
    for(long i = 2; i*i <= n; i++) {
        if(number[i]) // If number is already removed
            continue; // Do next number

        // Remove x * i
        for(long j = i*2; j <= n; j += i)
            number[j] = true;
    }

    // Print
    for(long i = 2; i <= n; i++)
        if(!number[i]) printf("%ld ", i);
}

3 个答案:

答案 0 :(得分:3)

这是无效的C ++,如果n不是常量整数表达式(你的不是):

bool number[n+1];

它是一个g ++扩展,并将数组放在调用堆栈上,该堆栈的大小有限。你已经溢出它,导致程序立即崩溃(恢复也没有例外),所以即使在g ++中这也是一个坏主意。

尝试

std::vector<bool> number(n+1);

(请注意,您需要#include <vector>来完成这项工作)

另请注意,vector<bool>是一个奇怪的野兽。应该可以正常使用,但为了更接近bool[],您也可以尝试

std::vector<char> number(n+1);

答案 1 :(得分:1)

这看起来不对:

bool number[n+1];

尝试std::vector<bool> number(n+1)bool* number = new bool[n+1]

答案 2 :(得分:1)

您正在尝试在堆栈上分配n个bool数组,这可能只是很小。尝试使用std :: vector或new运算符在堆上进行分配。