需要帮助在c ++中优化Eratosthenes的筛子

时间:2015-01-29 16:23:12

标签: c++ sieve-of-eratosthenes

我已经在Eratosthenes筛子上工作了几天了。它是今天到期的学校作业,我必须前往工作。代码工作得很完美,但是,我想把它优化成一个循环,而不是列出素数除数......任何建议?

void Eratos(int num, vector<int>&primes)
{
    int i;
    //we are setting up the variable for use
    for (i = 2; i <= num; i++)
{
    primes.push_back(i);
}

for (i = 0; i < primes.size(); i++)
{
    if ((primes.at(i) % 2 == 0) && (primes.at(i) != 2))
    {
        //if i is divisible by 2 change value to zero... and so on until 13
        primes.at(i) = 0;
    }
    if ((primes.at(i) % 3 == 0) && (primes.at(i) != 3))
    {
        primes.at(i) = 0;
    }
    if ((primes.at(i) % 5 == 0) && (primes.at(i) != 5))
    {
        primes.at(i) = 0;
    }
    if ((primes.at(i) % 7 == 0) && (primes.at(i) != 7))
    {
        primes.at(i) = 0;
    }
    if ((primes.at(i) % 13 == 0) && (primes.at(i) != 13))
    {
        primes.at(i) = 0;
    }
    if ((primes.at(i) % 17 == 0) && (primes.at(i) != 17))
    {
        primes.at(i) = 0;
    }
    if ((primes.at(i) % 19 == 0) && (primes.at(i) != 19))
    {
        primes.at(i) = 0;
    }
    if ((primes.at(i) % 23 == 0) && (primes.at(i) != 23))
    {
        primes.at(i) = 0;
    }
    if (primes.at(i) == 0)
    {
        //erase all '0' values from vector
        primes.erase(primes.begin() + i); 

        //keep place
        --i;
    }

(抱歉,如果格式很奇怪,这是我在这里发表的第一篇文章)

1 个答案:

答案 0 :(得分:0)

不要列出所有号码!

保留您已找到的素数列表,并尝试将所测试的数字除以找到的素数。