Eratosthenes筛选的问题

时间:2018-03-12 20:00:21

标签: c++ for-loop codeblocks primes sieve-of-eratosthenes

我选择了“使用C ++进行编程原理和练习”,并且正在做一个涉及Eratosthenes筛选的早期问题,而且我有意想不到的输出,但我无法准确确定问题所在。这是我的代码:

#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中使用嵌套循环的问题。哦,并且为了进一步指定我的输出问题,似乎它只向nonPrime向量添加了2的倍数,但其他一切都检查为通过测试(例如9)。

有人可以帮我理解我哪里出错吗?

1 个答案:

答案 0 :(得分:2)

鉴于这不是实现Eratosthenes筛选的好方法,我会指出对代码进行一些更改,使其至少输出正确的序列。

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

#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;
}