我想實現Eratosthenes Sieve的算法,但我不知道爲什麼這個程序崩潰的大型項目。最初我使用vector
,但現在我正在使用動態內存分配來實現這一點。Eratosthenes實現的篩
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
unsigned isqrt(unsigned value) {
return static_cast<unsigned>(sqrt(static_cast<float>(value)));
}
int main()
{
int t;
cin >> t;
long long * N;
long long * M;
long long n, m;
N = new long long[t];
M = new long long[t];
for(int i = 0; i < t ; i++){
cin >> M[i] >> N[i];
}
for(int i = 0; i < t ; i++){
n = N[i];
m = M[i];
bool * A;
A = new bool[n];
if(A == 0)
{
cout << "Memory cannot be allocated";
return 0;
}
for(int i=0;i < n;i++){
A[i]=true;
}
A[0] = false;
A[1] = false;
unsigned sqrt = isqrt(n);
for(int i = 2; i <= sqrt; i++)
{
if(A[i] == true){
for(int j = i*i; j <= n; j = j + i)
{
A[j] = false;
}
}
}
for(int i = m;i < n;i++)
{
if(A[i] == true)
cout << i << "\n";
}
delete[] A;
}
delete[] M;
delete[] N;
return 0;
}
程序崩潰對於較大的n
和m
(〜10^16)值。請幫助我。
我沒有看到問題,也沒有看到問題/錯誤。 – 2013-04-12 20:50:28
程序粉碎 - 不是問題? – 4pie0
'unsigned sqrt = isqrt(n)'**是** **。重新計算每個輸入對的篩網是多餘的。它應該只計算一次。 –