c – Eratosthenes筛选的上限查找素数的算法使程序停止工作
发布时间:2020-12-16 09:54:28 所属栏目:百科 来源:网络整理
导读:我已经使用了Eratosthenes算法的Sieve来查找在一定限度下的素数之和,并且它已经正常工作直到200万的限制,但是当我尝试了300万时,程序在执行时停止了.这是代码: int main(){ bool x[3000000]; unsigned long long sum = 0; for(unsigned long long i=0; i 30
我已经使用了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代替. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |