在观看了一些 Terence Tao 的视频后,我想尝试将算法实现到 C++ 代码中,以找到一个数 n 内的所有质数。在我的第一个版本中,我简单地测试了从 2 到 n 的每个整数是否可以被从 2 到 sqrt(n) 中的任何数字整除,并成功让程序在约 52 秒内找到了 1-10,000,000 之间的质数。
为了优化程序并实现我现在所知道的欧拉筛法,我认为任务完成的速度会比 51 秒快得多,但不幸的是,情况并非如此。即使是到 1,000,000,也需要相当长的时间(没有计时)。
这个程序的运行速度为什么如此缓慢?是因为向量的重复引用吗?即使我可能完全忽略了什么(我是完全的初学者),我认为使用这种可怕而低效的方法在2和1,000,000之间找到质数,应该比我最初的在2到10,000,000之间找到它们的方式要快得多。希望有人能给出清晰的答案 - 希望将来在优化使用大量递归的程序时可以使用所获得的任何知识。
为了优化程序并实现我现在所知道的欧拉筛法,我认为任务完成的速度会比 51 秒快得多,但不幸的是,情况并非如此。即使是到 1,000,000,也需要相当长的时间(没有计时)。
#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");
}
这个程序的运行速度为什么如此缓慢?是因为向量的重复引用吗?即使我可能完全忽略了什么(我是完全的初学者),我认为使用这种可怕而低效的方法在2和1,000,000之间找到质数,应该比我最初的在2到10,000,000之间找到它们的方式要快得多。希望有人能给出清晰的答案 - 希望将来在优化使用大量递归的程序时可以使用所获得的任何知识。