【问题标题】:Need help optimizing a sieve of Eratosthenes in c++需要帮助在 C++ 中优化 Eratosthenes 筛
【发布时间】:2015-01-29 16:23:11
【问题描述】:

我这几天一直在研究埃拉托色尼筛。这是今天到期的学校作业,我必须去上班。该代码运行完美,但是,我想将其优化为一个循环,而不是列出主要除数......有什么建议吗?

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

(对不起,如果格式很奇怪,这是我在这里的第一篇文章)

【问题讨论】:

  • 这最好发布到 CodeReview@StackExchange.com
  • 您可以首先将奇数放入向量中并删除对 2 的检查。
  • 埃拉托色尼筛法不测试可分性。首先划掉 2 的所有倍数(通过重复加 2 找到它们)。然后划掉下一个素数的所有倍数(按那个数重复加法),下一个,再下一个....

标签: c++ sieve-of-eratosthenes


【解决方案1】:

不要保留所有数字的列表!

保留您找到的素数的列表,并仅尝试将测试中的数字与找到的素数相除。

【讨论】: