当前位置: 首页 > 知识库问答 >
问题:

通过埃拉托斯特尼的筛子算法(C)找到素数

曹伟泽
2023-03-14

我想创建一个函数,找到所有素数,直到numbernum基于(筛分埃拉托色尼)算法

这是我的代码:

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个答案

范承志
2023-03-14

最里面的循环为(双 j = pow(i,2); j

您只想在每次迭代时将j增加ii,但实际上您是将它增加了一些 的倍数。

你也不应该把所有的j都加到素数上,它们都是通过构造来复合的。而是添加 i

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

您可以始终使用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;
    }
}
 类似资料:
  • 我在我的一个班级里做的一个作业,我们必须实现一个厄拉多塞的筛子。我已经尝试了七次来得到一个有效的代码,并且尝试了整合我研究过的许多解决方案。我终于有一个可以输出数字的了。不幸的是,它同时打印合数和质数,但不打印2。 我的代码如下: 我怀疑我的循环有问题。我修复了前两个循环的和变量,以便它从2开始打印出来,问题似乎是在我将数组初始化为true后,它没有将合数标记为。 提前感谢你的帮助。

  • 我正在尝试编写一个程序来实现对埃拉托西的筛选。我可以从2到任何给定的结束编号,但我们正在处理的赋值要求我们输入起始值。我完全被卡住了。我试过很多不同的代码,但它总是给我奇怪的答案。 我的起点是起始值,终点是结束值。我基本上想找到这个范围的素数。谢谢!!!

  • 做一个简单的筛子很容易: 但是当N非常大并且我无法在内存中持有这种数组时,该怎么办?我已经查找了分段筛方法,它们似乎涉及查找素数,直到sqrt(N),但我不明白它是如何工作的。如果 N 非常大(比如 10^18)怎么办?

  • 在一个类作业中,我被要求用Java编写Eratostenes筛选代码,我的代码效率非常低。运行时间不长,但我相当肯定,除了像我一样列出所有内容外,还有其他循环的空间。。 这是我的代码: 基本上,我所做的是将所有不是质数的元素设置为true… 所以我的主要2个问题是1。有没有办法实现一个循环,使代码更短2。如何打印此数组中所有为 true(质数)的元素

  • 我在python中找到了一个示例代码,它给出了直到< code>n的所有素数,但我就是不明白,为什么它会这样做? 我读过维基百科上关于埃拉托色尼筛子的文章,但根本不知道它是如何工作的。 请解释一下循环是如何工作的。 EDIT-发现代码都错了,因为它表示25为素数,通过更深入的搜索发现这不是筛子,有人能展示一个利用python中筛子的生成器并解释它吗

  • 我正在尝试实现筛选算法,它会询问连续数字列表的大小,并打印出该列表中的素数,但我收到了一个seg错误:11错误。 这是我的代码: