0
#include<iostream>
#include<cmath>
#include<vector>
using namespace std;


int main()
{
int n1;
cin>>n1;
long long int MAX,n;
while(n1--)
{
int* primes = new int[1000000000];
//vector<int> v[10000000];
//int primes[100000]={1};
cin>>n;
cin>>MAX;      
   int i,j; 
   for(i=2;i<=MAX;i++) primes[i] = 1; 
   for(i=2;i<=(int)sqrt(MAX);i++)
   {
   // cout<<"primes[i]\t"<<i<<" "<<primes[i]<<endl;
     if (primes[i]) 
     {
       for(j=i;j*i<=MAX;j++)
       {
        primes[i*j] = 0;
       // cout<<"primes[i*j]\t"<<i*j<<" "<<primes[i*j]<<endl;;
    }
    }
}
       primes[0]=0;
       primes[1]=0; 
        for(int i=n;i<=MAX;i++)
        {
            if(primes[i])
            cout<<i<<" "<<endl;
        }
        delete[] primes;
}
cout<<endl;

}

これは素数の範囲のプログラムです。つまり、2つの数の間の素数を見つけるために私はerthensesアルゴリズムのふるいを使用しています。大きな入力とより多くのテストケースの問題はSIGABRTを示しており、オンライン裁判官のSIGSEGVは理解できません。これを行う方法を教えてください。

4

2 に答える 2

2

以下:

int* primes = new int[1000000000];

4GBのRAMを割り当てようとします(int32ビットと仮定)。

オンラインジャッジはあなたのプロセスがそれだけのRAMを割り当てることを許可しますか?疑わしい。

厳密に言えば、要素ごとに1ビットしか必要ないため(0または1であるため)、残りの31ビット(または割り当てているメモリの97%)が無駄になります。

于 2013-03-14T10:39:57.813 に答える
0

のオーバーフローにより、i*j誤ったメモリアクセス(負のインデックス)が発生する可能性があります。

乗算の結果は整数です。あなたはキャストする必要がありiます。junsigned long

于 2013-03-14T10:37:16.137 に答える