看了一些Terence Tao的視頻之後,我想嘗試將算法應用到C++代碼中,以查找所有素數達到n的數字。在我的第一個版本中,我測試了每個從2到n的整數,看看它們是否可以被2到sqrt(n)中的任何一個整除,然後我在52秒內找到了1-10,000,000之間的素數。我試圖優化程序並實施我現在知道的Eratosthenes篩選,我認爲這項任務將比51秒快得多,但可悲的是,情況並非如此。即使達到1,000,000也需要花費相當長的時間(雖然沒有時間)C++優化此算法
#include <iostream>
#include <vector>
using namespace std;
void main()
{
vector<int> tosieve = {};
for (int i = 2; i < 1000001; i++)
{
tosieve.push_back(i);
}
for (int j = 0; j < tosieve.size(); j++)
{
for (int k = j + 1; k < tosieve.size(); k++)
{
if (tosieve[k] % tosieve[j] == 0)
{
tosieve.erase(tosieve.begin() + k);
}
}
}
//for (int f = 0; f < tosieve.size(); f++)
//{
// cout << (tosieve[f]) << endl;
//}
cout << (tosieve.size()) << endl;
system("pause");
}
它是重複引用的向量還是什麼?爲什麼這麼慢?即使我完全忽略了某些東西(可能是,完全初學者:I),我認爲用這種可怕的低效率方法找到2到1,000,000的素數會比我從2到10,000,000找到它們的原始方式更快。
希望有人對此有明確的答案 - 希望在使用大量遞歸優化程序時,我可以使用將來收集的任何知識。
請修復您的縮進。 – cdonat
從矢量末尾以外的任何地方擦除元素都很慢,是的。 – emlai
Eratosthenes的篩沒有測試可分性,它只使用加法。 (你不需要知道任何算法來手動執行篩。) – molbdnilo