我用Eratosthenes的Sieve编写了这个程序。它应该输出高达2'500'000的素数,但是当试图创建大于~2'100'000的数组时它会崩溃。什么想法可能会被打破?
在Code :: Blocks中使用gcc进行编译(Windows 8.1,对我很羞耻)。
PS对于N <= 2'000'000
,它完美无缺#include <stdio.h>
int main() {
// Input
long n;
scanf("%ld", &n);
// Initialize vars
bool number[n+1];
for(long i = 0; i < n; i++)
number[i] = false;
// Main loop
for(long i = 2; i*i <= n; i++) {
if(number[i]) // If number is already removed
continue; // Do next number
// Remove x * i
for(long j = i*2; j <= n; j += i)
number[j] = true;
}
// Print
for(long i = 2; i <= n; i++)
if(!number[i]) printf("%ld ", i);
}
答案 0 :(得分:3)
这是无效的C ++,如果n
不是常量整数表达式(你的不是):
bool number[n+1];
它是一个g ++扩展,并将数组放在调用堆栈上,该堆栈的大小有限。你已经溢出它,导致程序立即崩溃(恢复也没有例外),所以即使在g ++中这也是一个坏主意。
尝试
std::vector<bool> number(n+1);
(请注意,您需要#include <vector>
来完成这项工作)
另请注意,vector<bool>
是一个奇怪的野兽。应该可以正常使用,但为了更接近bool[]
,您也可以尝试
std::vector<char> number(n+1);
答案 1 :(得分:1)
这看起来不对:
bool number[n+1];
尝试std::vector<bool> number(n+1)
或bool* number = new bool[n+1]
答案 2 :(得分:1)
您正在尝试在堆栈上分配n个bool数组,这可能只是很小。尝试使用std :: vector或new运算符在堆上进行分配。