簡體   English   中英

質數發生器中的sigabrt和sigsegv錯誤

[英]sigabrt and sigsegv error in prime number generator

#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在線判斷我無法計算如何做到這一點任何幫助表示贊賞謝謝

下列:

int* primes = new int[1000000000];

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

在線判斷是否允許您的進程分配那么多RAM? 我對此表示懷疑。

嚴格地說,每個元素只需要一個位(因為它是零或一個),所以剩余的31位(或者你分配的內存的97%)都被浪費了。

i*j的溢出可能導致不正確的內存訪問(負索引)。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM