[英]Finding prime numbers by Sieve of Eratosthenes algorithm(C++)
我想創建一個函數,根據( Eratosthenes篩分 )算法找到所有素數直到數字num
這是我的代碼:
vector<int> prime(double num){
vector<int> check;
vector<int> prime;
if(num < 2) throw "Number must be bigger than or equal to 2!";
for(int i = 0; i<num;++i){
check.push_back(1);
}
for(double i = 2;i<sqrt(num);++i){
int k = 1;
if(check.at(i) == true){
for(double j = pow(i,2); j<num; j = j+k*i){
check[j] = 0;
prime.push_back(j);
++k;
}
}
}
return prime;
}
int main(){
int num;
vector<int> v;
cout << "Enter number n bigger than 1:";
cin >> num;
v = prime(num);
for(int i;i<v.size();++i){
cout << v[i];
}
}
我按部分檢查了代碼,除此部分外,其他所有工作均正常進行:
for(double i = 2;i<sqrt(num);++i){
int k = 1;
if(check.at(i) == true){
for(double j = pow(i,2); j<num; j = j+k*i){
check[j] = 0;
prime.push_back(j);
++k;
}
}
}
代碼中沒有錯誤,但是沒有輸出,我不明白為什么。
for(double j = pow(i,2); j<num; j = j+k*i)
的最內層循環相當可疑。
你只需要增加j
由i
每次迭代,而是你被一些多增加它i
。
您也不應該將所有j
都添加到prime
,它們是通過構造全部合成的。 而是加i
。
因為for
循環在運行前檢查條件,所以您無需throw
num <2,因此只需返回一個空向量(沒有質數小於2)。
而不是對double
進行整數處理,可以在整個過程中使用int
。
vector<int> prime(int num){
vector<bool> check(num, true); // num copies of true
vector<int> prime;
for(int i = 2; i < num; ++i){
if(check[i]){
prime.push_back(i);
for(int j = i*i; j < num; j += i){
check[j] = false;
}
}
}
return prime;
}
int main(){
cout << "Enter number n bigger than 1:";
int num;
cin >> num;
vector<int> v = prime(num);
for(int i : v){
cout << i;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.