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

厄拉多塞筛子的问题

廖君昊
2023-03-14

我选择了“使用C进行编程原理和实践”,并且正在做一个涉及埃拉托色尼筛的早期问题,我有意想不到的输出,但我无法确定问题到底是什么。这是我的代码:

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> prime;
    std::vector<int> nonPrime;
    int multiple = 0;


    for(int i = 2; i < 101; i++) //initialized to first prime number, i will 
       // be the variable that should contain prime numbers
        {
            for(int j = 0; j < nonPrime.size(); j++) //checks i against 
                                                      //   vector to see if 
                                                      //  marked as nonPrime
                {
                    if(i == nonPrime[j])
                        {
                            goto outer;//jumps to next iteration if number 
                                        // is on the list
                        }
                }

                prime.push_back(i); //adds value of i to Prime vector if it 
                                         //passes test

                for(int j = i; multiple < 101; j++) //This loop is where the 
                                                      // sieve bit comes in
                    {                           
                        multiple = i * j;           
                        nonPrime.push_back(multiple);
                    }
                outer:
                    ;
        }

        for(int i = 0; i < prime.size(); i++)
            {
                std::cout << prime[i] << std::endl;
            }


    return 0;
}

这个问题目前只要求我使用这种方法找到最大100的质数。我还尝试使用当前的“goto”方法在某些情况下跳出双循环,我还尝试在检查循环之后使用带有if语句的布尔标志,并简单地使用“继续”语句,但都没有任何效果。

(老实说,我想既然人们说goto是邪恶的,也许它会产生我没有预料到的后果,这就是为什么我试图把它关掉),但是这个问题不需要我使用模块化函数,所以我假设它希望我在main中解决所有问题,因此我在main中使用嵌套循环的问题。哦,为了进一步说明我的输出问题,它似乎只在非Prime向量上添加了2的倍数,但其他一切都通过了测试(例如9)。

有人能帮我理解我错在哪里吗?

共有1个答案

欧金鹏
2023-03-14

鉴于这不是实现埃拉托斯特尼筛的好方法,我将指出对代码的一些更改,以使其至少输出正确的序列。

也请注意你选择的缩进有点误导,在第一个内部循环之后。

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> prime;
    std::vector<int> nonPrime;
    int multiple = 0;


    for(int i = 2; i < 101; i++) 
    {
        // you can use a flag, but note that usually it could be more 
        // efficiently implemented with a vector of bools. Try it yourself
        bool is_prime = true;
        for(int j = 0; j < nonPrime.size(); j++)
        {
            if(i == nonPrime[j])
            {
                is_prime = false;
                break;
            }
        }

        if ( is_prime )
        {
            prime.push_back(i);
            // You tested 'multiple' before initializing it for every
            // new prime value
            for(multiple = i; multiple < 101; multiple += i)
            {                           
                nonPrime.push_back(multiple);
            }
        }
    }

    for(int i = 0; i < prime.size(); i++)
    {
        std::cout << prime[i] << std::endl;
    }

    return 0;
}
 类似资料:
  • 我有一个问题,我有一个需要使用数组的赋值。我需要创建埃拉托斯特尼筛算法并打印出所有素数。我很困惑,因为据我所知,我的操作顺序是正确的。代码如下: 我首先将数组中的所有数字设置为true。然后第二个循环将从2开始“x”,然后在其中是一个嵌套循环,它将“x”乘以“n”的值,并且只要乘积(“y”)小于1000,“n”就会继续增加。一旦“y”达到最大值,“x”就会增加一个数字,重复该过程,直到所有非质数都

  • 我用Python2.7编写了一段代码,用于创建质数列表。代码是 这是否比埃拉托斯特尼筛更有效?我认为记忆效率应该更好,但我怀疑时间效率。如何计算时间和内存效率,以及如何对效率进行基准测试?

  • 我必须为'sieve of eratosthenes'算法编写一个java代码,以便在控制台上打印出给定最大值的素数,但我不被允许使用数组。我们的教授告诉我们,只有在循环的帮助下才能做到这一点。 所以我想了很多,在谷歌上搜索了很多关于这个话题的信息,但都找不到答案。我认为这根本不可能,因为你已经把那些数字已经被划掉的信息存储在某个地方了。 我的代码到现在为止: - 但是如果有一个解决方案,如果有人

  • 我正在解决欧拉项目的一些问题,必须生成200万质数来解决一个问题。我对埃拉托色尼筛的实现非常慢,但我不知道为什么。有人能解释一下这个实现的主要问题吗?我觉得它很漂亮,然后我发现它非常糟糕:(。我在网上找到了它的另一个实现,它比我的快得多。 编辑:感谢所有的答案!结论是过滤器是问题所在,因为它会遍历每个元素(而不仅仅是那些被标记为非素数的元素),而且每次都会创建一个新列表。用旧的循环和一轮过滤重写它

  • 我应该编写一个函数或脚本,找出所有小于给定整数n的质数p 我意识到这与我应该写的代码相去甚远。但这是我想到的唯一想法,它只删除了可被2和3整除的数字,我需要找到所有素数,对每个entry.This重复这一点显然不明智。但我觉得可以为此创建一个循环。但我没有编写这个循环。请帮助我。

  • 我正在尝试创建一个程序,它输出给定输入值n的素数列表。 我创建的SieveEratosthenes函数:-在前n个整数上生成素数列表-为生成的素数列表创建存储-返回生成的素值的数量。 以下是我的主函数中的代码: 假设n=20;我的输出是: 生成8个素数的列表 2 3 5 7 11 13' 我想要的输出应该是“2 3 5 7 11 13 17 19” 我的筛选函数工作正常,但我无法在主函数中打印出整