Przed chwilą wpadłem na taki pomysł. przede wszystkim, nie ma sensu iterować każdej liczby pokolei, iterujemy co drugą poczynając od 3.
Jeżeli znamy pierwsze 2 pierwsze liczby pierwsze, to sprawdzamy liczbę czy jest pierwszą dla liczb mniejszych od pierwiastka liczby sprawdzanej. Np:
Jeżeli mamy pierwsze[] = {2, 3}
to sprawdzamy 5 % 3 != 0 - czyli 5 jest liczbą pierwszą
sprawdzamy 7 % 3 != 0 - czyli 7 jest liczbą pierwszą
sprawdzamy 9 % 3 == 0 - czyli 9 nie jest liczbą pierwszą
sprawdzamy 11 % 3 != 0- czyli jest liczbą pierwszą
...
sprawdzamy 19 % 3 != 0 - czyli jest l. pierwszą
...
sprawdzamy 25 % 3 != 0, sprawdzamy 25 % 5 == 0 - czyli nie jest liczbą pierwszą
sprawdzamy 27 % 3 == 0 - przerywamy
sprawdzamy 29 % 3 != 0 , sprawdzamy 29 % 5 != 0 - czyli jest liczbą pierwszą, itd.
Sprawdzamy podzielność tylko przez liczby pierwsze które trzymamy w tablicy, a oto kod:
#include <iostream>
using namespace std;
int main()
{
const int MAX = 100;
int zakres = 1, nxt = 2;
bool pierwsza = true;
int pierwsze[MAX] = {2, 3};
for(int i = 3; i < MAX; i += 2)
{
if(sqrt(double(i)) == pierwsze[zakres + 1])
++zakres;
for(int j = 1; j <= zakres; ++j)
{
if(!(i % pierwsze[j]))
{
pierwsza = false;
break;
}
else
pierwsza = true;
}
if(pierwsza)
pierwsze[nxt++] = i;
}
for(int i = 0; i < nxt; ++i)
cout << pierwsze[i] << endl;
getchar();
return 0;
}