エラトステネスのふるいを使用して素数のジェネレーターを作成しています。521102 未満の素数を生成するように動作するようになりましたが、それ以上の数を指定するとプログラムがクラッシュします。これが私のコードです。
#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' what(): std::bad_alloc のインスタンスをスローした後に呼ばれる終了
このアプリケーションは、異常な方法で終了するようランタイムに要求しました。詳細については、アプリケーションのサポート チームにお問い合わせください。
5億の屋根を持つことは許容範囲に近いですが、それでも高い方が良いでしょうか? 他のアイデアはありますか?