【问题标题】:High limit in Sieve of Eratosthenes Algorithm for finding prime numbers makes the program stop working用于寻找素数的 Eratosthenes 筛选算法的上限使程序停止工作
【发布时间】:2014-09-30 08:22:19
【问题描述】:

我已经使用埃拉托色尼筛法算法来查找特定限制下的素数之和,并且它一直正常工作,直到限制为 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;
}

【问题讨论】:

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


    【解决方案1】:

    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

    【讨论】:

    • static 运行良好.. 但是当我像你在这里使用符号常量时,它给了我一个错误:'x' 的存储大小不是恒定的。
    • 哦-您使用的是非常旧的编译器吗?在这种情况下,您可能必须使用#define n 3000000 而不是const size_t n = 3000000;
    • 它有时有很高的限制给我负数..为什么会这样?例如 400 万个限制输出 -959202331
    • 您的 printf 格式说明符错误:将 printf("%ld", sum); 更改为 printf("%llu", sum);
    • 非常感谢你..你真是太棒了:)祝你有美好的一天:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多