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

} 

이가 보여주는 SIGABRT있는 프로그램입니다 그리고 몇 시간은 온라인 판사에서 SIGSEGV 나는이 일을하는 방법을 알아낼 수 없다는 것을 이해할 수 없다 감사합니다SIGABRT와 SIGSEGV 오류가

답변

2

다음

int* primes = new int[1000000000]; 

RAM이 4GB의 할당을 시도한다 (int 가정하는 32 비트이다).

온라인 판사가 귀하의 프로세스가 그만큼의 RAM을 할당하도록 허용합니까? 나는 그것을 의심한다.

엄밀히 말하면 요소 당 하나의 비트 만 필요하므로 나머지 31 비트 (또는 할당하려는 메모리의 97 %)가 낭비됩니다.

0

i*j의 오버플로가 부정확 한 메모리 액세스 (음수 인덱스)를 유발할 수 있습니다.

결과는 정수입니다. 당신은 캐스트 ij to unsigned long해야합니다.