Я написал программу, которая ищет простые числа:
#include <iostream>
#include <fstream>
#include <chrono>
typedef std::chrono::high_resolution_clock Clock;
using namespace std;
int main() {
int p;
int x = 1;
int b;
int a[1000000];
bool n = false;
a[0] = 2;
a[1] = 3;
auto t1 = Clock::now();
ofstream outfile;
outfile.open("p.txt");
for (p = 3; p < 7500000; p = p + 2)
{
for (b = 0; b <= x && n == 0; b++)
{
if (p % a[b / 2] == 0)
{
n = true;
}
}
if (n == false)
{
cout << p << endl;
outfile << p << endl;
x++;
a[x] = p;
}
else
{
n = false;
}
}
auto t2 = Clock::now();
std::cout
<< std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count()
<< " nanoseconds" << std::endl;
outfile.close();
}
Первоначально для приращения цикла у меня было p++
, но я изменил это на p=p+2
, потому что все простые числа в основном нечетные и четные числа проверять не нужно. Проблема в том, что, когда я тестировал это, не было никакой разницы в скорости между старым и новым кодом. Так что же является узким местом в процессе, если проверка всех чисел ничем не отличается от проверки половины? И есть ли лучший способ приблизиться к этому?