Mój algorytm wykorzystuje obserwację, że liczba pierwsza to taka, która nie dzieli się przez inną l. pierwszą. I to cały sekret.
Udoskonaliłem go o te += 6 (+-1)
#include <iostream>
#include <cmath>
#include <ctime>
#define ROZMIAR 100000
bool czyPierwsza(unsigned int i, unsigned int * tab, unsigned int n)
{
double maxi = std::sqrt(i);
for (unsigned int j = 0; tab[j] <= maxi && j < n; j++)
if (i % (*(tab + j)) == 0)
return false;
return true;
}
int main()
{
using namespace std;
unsigned long long start = clock();
unsigned int tab[ROZMIAR] = {2, 3};
unsigned int j = 2;
for (unsigned int i = 6; j < ROZMIAR; i += 6)
{
if (czyPierwsza(i - 1, tab, ROZMIAR))
(*(tab + j++)) = i - 1;
if (czyPierwsza(i + 1, tab, ROZMIAR))
(*(tab + j++)) = i + 1;
}
for (int i = 0; i < ROZMIAR; i++)
cout << (*(tab + i)) << " ";
cout << endl << "!" << ((clock() - (double)start) / CLOCKS_PER_SEC) << "!";
return 0;
}