我想用集合來計算素數,但是當我做計算時,我的迭代器隨機跳躍。使用集合計算素數,C++
我想實現這個方法的值爲N = 10。
選擇一個整數n。該函數將計算所有質數 至n。首先將所有從1到n的數字插入到一個集合中。然後清除所有 的倍數(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;
}
Eratosthenes的篩沒有使用任何形式的可分性測試。您可以手動執行,而不必知道任何算術。 – molbdnilo