Mah*_*bry 3 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;
}
Run Code Online (Sandbox Code Playgroud)
最有可能bool x[3000000];导致堆栈溢出,因为它将需要比堆栈上通常可用的内存更多的内存.作为快速修复,将其更改为:
static bool x[3000000];
Run Code Online (Sandbox Code Playgroud)
或考虑使用动态内存分配:
bool *x = malloc(3000000 * sizeof(*x));
// do your stuff
free(x);
Run Code Online (Sandbox Code Playgroud)
sum声明为unsigned long long- 更改:
printf("%ld", sum);
Run Code Online (Sandbox Code Playgroud)
至:
printf("%llu", sum);
Run Code Online (Sandbox Code Playgroud)
如果你正在使用一个合适的编译器(例如gcc)并启用了警告(例如gcc -Wall ...),那么编译器应该已经警告过你这个错误了.
3000000- 使用符号常量,然后你只需要在一个地方定义值 - 这就是所谓的"单点真相"(SPOT)原则,或者"不要重复自己"(干):
const size_t n = 3000000;
Run Code Online (Sandbox Code Playgroud)
然后在目前使用的任何地方3000000使用n.
| 归档时间: |
|
| 查看次数: |
192 次 |
| 最近记录: |