【发布时间】:2015-12-22 19:17:35
【问题描述】:
我正在尝试使用一个集合来计算素数,但是当我进行计算时,我的迭代器随机跳跃。
我正在尝试为 N=10 的值实现此方法。
选择一个整数 n。此函数将计算所有素数 到 n.首先将从 1 到 n 的所有数字插入到一个集合中。然后全部抹去 2 的倍数(2 除外);即 4, 6, 8, 10, 12, .... 全部擦除 3 的倍数,即 6, 9, 12, 15, ... 。上升到 sqrt(n) 。这 剩下的数字都是素数。
当我运行我的代码时,它会删除 1 然后 pos 跳转到 4?我不确定为什么会发生这种情况,而不是转到值 2,即集合中的第二个值?
在我删除迭代器指向的值后会发生什么,迭代器指向什么,如果我将它推进它会推进到哪里?
代码如下:
set<int> sieveofEratosthenes(int n){ //n = 10
set<int> a;
set<int>::iterator pos = a.begin();
//generate set of values 1-10
for (int i = 1; i <= n; i++) {
a.insert(i);
if(pos != a.end())
pos++;
}
pos = a.begin();
//remove prime numbers
while (pos != a.end())
{
cout << "\nNew Iteration \n\n";
for (int i = 1; i < sqrt(n); i++) {
int val = *pos%i;
cout << "Pos = " << *pos << "\n";
cout << "I = " << i << "\n";
cout << *pos << "/" << i << "=" << val << "\n\n";
if (val == 0) {
a.erase(i);
}
}
pos++;
}
return a;
}
【问题讨论】:
-
埃拉托色尼筛法不使用任何形式的可分性测试。您可以在根本不知道任何算术的情况下手动执行它。