簡體   English   中英

通過Eratosthenes算法的Sieve查找素數(C ++)

[英]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)的最內層循環相當可疑。

你只需要增加ji每次迭代,而是你被一些多增加它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.

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