2013-03-14 62 views
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; 

} 

這是程序素數的範圍,即把兩個數字我使用erthenses的篩算法我的問題了較大的輸入和更多的測試用例之間發現的素數是表示SIGABRT有些時候SIGSEGV在網上裁判中我無法弄清楚如何做到這一點,任何幫助表示讚賞謝謝SIGABRT和SIGSEGV錯誤

回答

2

以下:

int* primes = new int[1000000000]; 

將嘗試分配4GB的RAM(假設int是32位)。

在線裁判會允許你的程序分配那麼多的RAM嗎?我對此表示懷疑。

嚴格來說,每個元素只需要一位(因爲它是零或一個),所以其餘的31位(或您分配的內存的97%)被浪費了。

0

i*j的溢出會導致不正確的內存訪問(負指數)。

乘法的結果是整數。你應該投ijunsigned long