[英]C++ : Segmentation fault (core dumped) issue
Eratosthenes篩選器在C ++中的實現:
當我運行我的C ++程序時,我得到
“分段故障(核心已轉儲)”
它編譯沒有任何錯誤。
在此程序中,我試圖打印兩個數字a和b之間的所有素數。
#include <iostream>
#include <string.h>
#define MAX 1000000
using namespace std;
// Print all primes s.t. a <= prime <= b
int main()
{
int t; // no of test cases
cin>>t;
bool prime[MAX + 1]; // a[i] = true for i = prime
long int count_primes_lte_me[MAX + 1]; // a[i] = Count ( primes ) <= i
long int counter_of_visited_primes;
prime[0] = prime[1] = false;
for(int i = 2 ; i <= MAX ; i++)
{
if(prime[i] == true)
count_primes_lte_me[i] = ++counter_of_visited_primes;
for(int j = i*i ; j <= MAX ; j += i) // sieve of eratosthenes
prime[j] = false;
}
long int a , b;
while(t--)
{
cin>>a>>b;
cout<<count_primes_lte_me[b] - count_primes_lte_me[a - 1]<<endl;
}
return 0;
}
嘗試使用較小的MAX
值。 在堆棧上分配如此巨大的數組會產生(初始)問題。 然后替換為動態分配:
bool *prime = new bool[MAX+1];
if (prime==nullptr) // error
...
delete [] prime;
您也可以使用靜態分配(將變量定義為全局變量)。
最好是使用一些適當的容器,例如bitset
。
請注意 , i*i
可能會溢出,因此可能會出現其他問題...
i * i
將在您的內部循環中溢出,因為i <= MAX
。 由於負j
可能會導致段錯誤。 使用更大的整數類型: long long j = (long long)i * i
。
為了正確起見,您需要將prime
數組初始化為true
,並將count數組初始化為0
值。
您的最大數量為一百萬...我嘗試減少它,沒有錯誤,但仍然沒有任何效果...試試這個
/************************************
***Array names as pointers***********
************************************/
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
const int MAX = 10000;
long prime[MAX] = { 2, 3, 5 };
long trial = 5;
int count = 3;
int found = 0;
do
{
trial += 2;
found = 0;
for (int i = 0; i < count; i++)
{
found = (trial % *(prime + i)/* prime[i] */) == 0;
if (found)
break;
}
if (found == 0)
*(prime + count++)/* prime[count++] */ = trial;
} while (count < MAX);
for (int i = 0; i < MAX; i++)
{
if (i % 5 == 0)
cout << endl;
cout << setw(10) << *(prime + i)/* prime[i] */;
}
cout << endl;
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.