下面是我的C++代码,我正在努力加快速度。我如何写入内存,然后在最后将整个文件转储到“Primes List.txt”?如果你能帮上忙的话,谢谢你。
#include <vector>
#include <iostream>
#include <fstream>
#include <chrono>
using namespace std;
int main()
{
cout << "\n\n\n Calculating all Prime Numbers up to 82,000,000";
cout << "\n\n You will have to give me exactly a minute! ...";
cout << "\n\n ";
auto start = chrono::steady_clock::now();
ofstream myfile;
myfile.open("Primes List.txt");
myfile << "2\n";
vector<int> primes;
primes.push_back(2);
for (int i = 3; i < 82000000; i++)
{
bool prime = true;
for (int j = 0; j < primes.size() && primes[j] * primes[j] <= i; j++)
{
if (i % primes[j] == 0)
{
prime = false;
break;
}
}
if (prime)
{
primes.push_back(i);
myfile << i << "\n";
}
}
auto end = chrono::steady_clock::now();
chrono::duration<double> elapsed_seconds = end - start;
myfile << "\n Elapsed Time: " << elapsed_seconds.count() << " seconds\n";
cout << "Elapsed Time: " << elapsed_seconds.count() << " seconds\n\n\n";
myfile.close();
system("pause");
return 0;
}
我在一台相当强大的PC上运行这个程序,希望它运行得更快。
1条答案
按热度按时间qojgxg4l1#
正如多位评论者所指出的,第一个问题是加快总理一代。下面的代码1)使用了一个位图作为筛选,这大大减少了所需的内存,2)只检查
+/-1 mod 6
的数字。这是我所知道的最快的筛法。在我的机器上,它只花了108ms就可以覆盖高达82M。筛选的几率是180ms,我没有足够的耐心来衡量规范的筛选算法。
示例代码
对于没有
std::countr_one
可用的C++
版本,下面是一个实现。