通过Sieve of Eratosthenes算法(C ++)查找素数

时间:2017-11-10 09:26:58

标签: c++ sieve-of-eratosthenes

我想创建一个函数,根据(Sieve of 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;
        }
    }
}

代码中没有错误,但没有输出,我无法理解原因。

1 个答案:

答案 0 :(得分:1)

最里面的循环for(double j = pow(i,2); j<num; j = j+k*i)相当可疑。

您只希望每次迭代j增加i,而是将其增加i的某个倍数。

您也不应该将所有j添加到prime,它们都是构建所有复合的。而是添加i

由于for循环在运行之前检查条件,因此对于num&lt;而不需要throw 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;
    }
}