质数发生器中的sigabrt和sigsegv错误

时间:2013-03-14 10:36:04

标签: c++

#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在网上判断我不是能够弄清楚如何做到这一点任何帮助表示赞赏

2 个答案:

答案 0 :(得分:2)

以下内容:

int* primes = new int[1000000000];

将尝试分配4GB的RAM(假设int为32位)。

在线评判是否允许您的进程分配那么多内存?我对此表示怀疑。

严格地说,每个元素只需要一个位(因为它是零或一个),所以剩下的31位(或者你分配的内存的97%)都被浪费了。

答案 1 :(得分:0)

i*j的溢出可能导致错误的内存访问(负索引)。

乘法的结果是整数。您应该将演员ij投放到unsigned long