通过埃拉托色尼筛算法(C++)查找素数

Posted

技术标签:

【中文标题】通过埃拉托色尼筛算法(C++)查找素数【英文标题】:Finding prime numbers by Sieve of Eratosthenes algorithm(C++) 【发布时间】:2017-11-10 09:26:58 【问题描述】:

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

代码没有错误,但是没有输出,我不明白为什么。

【问题讨论】:

在解决整数(整数)问题时不要在任何地方使用浮点数。 旁白:x == true 在布尔上下文中完全等同于 x @Caleth 但我确实检查 [j] = 0,我想它应该使一些系数等于 0。我说得对吗? 为什么要把每个 j 推到素数上? 你的代码可能还有其他问题,但我看到for(int i;i&lt;v.size();++i)应该初始化i=0 【参考方案1】:

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

您只想在每次迭代中将j 增加i,而是将其增加i 的一些倍数。

您也不应该将所有js 添加到prime,它们是通过构造全部复合的。而是添加i

因为for循环在运行前检查条件,所以不需要throw for num

您可以在整个int 中使用int,而不是在double 中做整数问题。

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;
    

【讨论】:

以上是关于通过埃拉托色尼筛算法(C++)查找素数的主要内容,如果未能解决你的问题,请参考以下文章

埃拉托色尼筛法(Sieve of Eratosthenes)求素数。

埃拉托色尼筛 - 寻找素数 Python

使用埃拉托色尼筛法找到第 n 个素数

优化埃拉托色尼筛

在给定数字之后查找质数

埃拉托色尼筛 - 主要因素