我正在爲使用eratosthenes篩的質數編寫一個生成器。我已經得到它在521102以下產生質數,但任何更高的數字都會導致程序崩潰。這是我的代碼。Prime Generator溢出? C++
#include <iostream>
using namespace std;
int main()
{
int long MAX_NUM = 1000000;
int long MAX_NUM_ARRAY = MAX_NUM+1;
int Num_Array [MAX_NUM_ARRAY];
std::fill_n(Num_Array, MAX_NUM_ARRAY, 3);
int long sieve_prime = 2;
int long sieve_prime_constant = 0;
Num_Array [0] = 1;
Num_Array [1] = 1;
while (sieve_prime_constant <= MAX_NUM_ARRAY)
{
if (Num_Array [sieve_prime_constant] == 1)
{
sieve_prime_constant++;
}
else
{
Num_Array [sieve_prime_constant] = 0;
sieve_prime=sieve_prime_constant;
while (sieve_prime<=MAX_NUM_ARRAY - sieve_prime_constant)
{
sieve_prime = sieve_prime + sieve_prime_constant;
Num_Array [sieve_prime] = 1;
}
if (sieve_prime_constant <= MAX_NUM_ARRAY)
{
sieve_prime_constant++;
sieve_prime = sieve_prime_constant;
}
}
}
return 0;
}
我把MAX_NUM放在1000000,它不起作用。但正如我之前所說,521102以下的數字確實有效。我需要能夠測試更高的數字。我的問題是什麼,我該如何解決?
非常感謝!
感謝您的回覆。我嘗試了動態分配數組的解決方案。它在一定程度上運行良好。 MAX_NUM設置爲5億左右後,我得到這個錯誤,當我運行程序...
終止叫做拋出的「的std :: bad_alloc的」 實例以後有什麼()的std :: bad_alloc的
此應用程序已經要求運行時以不尋常的方式終止它。 有關更多信息,請聯繫應用程序的支持團隊。
擁有500萬的屋頂接近可接受的水平,但更高的水平仍然會更好? 有沒有其他想法?
哪一行確切導致崩潰? – 2013-02-10 17:40:37
您可能正在Windows上運行,可能超過堆棧的最大限制。要麼動態分配數組,要麼靜態分配(可能在函數之外)或找到增加堆棧大小的方法。 – 2013-02-10 17:42:53
這不是問題,但使用長整數的習慣用法是將它們簡單地聲明爲「long」。 – 2013-02-10 19:49:22