【发布时间】: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 找到它们)。然后划掉下一个素数的所有倍数(按那个数重复加法),下一个,再下一个....