C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 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;
}

解决方法

最有可能是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)原则,或者“不要重复自己”(干):

const size_t n = 3000000;

然后无论你在哪里使用3000000使用N代替.

大佬总结

以上是大佬教程为你收集整理的c – Eratosthenes筛选的上限查找素数的算法使程序停止工作全部内容,希望文章能够帮你解决c – Eratosthenes筛选的上限查找素数的算法使程序停止工作所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。