Eratosthenes筛选的上限用于查找素数的算法使程序停止工作

时间:2014-09-30 08:22:19

标签: c loops runtime-error sieve-of-eratosthenes

我使用了Eratosthenes算法的Sieve来查找在一定限度下的素数之和,并且它已经正常工作直到200万的限制,但是当我尝试了300万时,程序在执行时停止了。这是代码:

int main(){

    bool x[3000000];
    unsigned long long sum = 0;

    for(unsigned long long i=0; i< 3000000; i++)
        x[i] = true;

    x[0] = x[1] = false;

    for(unsigned long long i = 2; i < 3000000; i++){
        if(x[i]){
            for (unsigned long long j = 2; i * j < 3000000; j++) {
                x[j*i] = false;
            }
            sum += i;
        }
    }

    printf("%ld", sum);

    return 0;
}

1 个答案:

答案 0 :(得分:7)

最有可能bool x[3000000];将导致stack overflow,因为它将需要比堆栈上通常可用的内存更多的内存。作为快速修复,将其更改为:

static bool x[3000000];

或考虑使用动态内存分配:

bool *x = malloc(3000000 * sizeof(*x));

// do your stuff

free(x);

<小时/> 另请注意,printf格式说明符错误,因为sum声明为unsigned long long - 更改:

printf("%ld", sum);

为:

printf("%llu", sum);

如果你正在使用一个合适的编译器(例如gcc)并启用了警告(例如gcc -Wall ...),那么编译器应该已经警告过你这个错误了。

<小时/> 还有一个提示:不要使用像3000000这样的硬编码常量 - 使用符号常量,然后你只需要在一个地方定义值 - 这被称为“单点真相”(SPOT) )原则,或“不要重复自己”(DRY):

const size_t n = 3000000;

然后在您使用3000000的任何地方使用n代替。