Ovaj kod ti, kao što si već verovatno i primetio

ispisuje sve proste brojeve, a koristi algoritam Eratostenovog sita.
1) Pošto ispisuje sve proste brojeve do 9.000.000 treba mu niz od 9.000.000 elemenata i par brojača.
Code:
int a[9000000], i = 9000000, n = i, p = 1;
2) Onda predpostavi da su svi prosti, tj. svakom elementu niza dodeli jedinicu, pošto će ispisivati samo one brojeve za čije pozicije se u nizu nalazi jedinica.
Code:
while (--i) a[i] = 1;
3) E sad, pošto je
p postavljeno na jedinicu, a operator ++ je prefiksni, onda će prvo da poveća
p za 1 pa tek onda da ga uporedi sa
n, što u prevodu znači, da
p polazi od 2, što nam i treba, jer je 2 prvi prost broj. I tu ustvari ulazimo u petlju za ispisivanje prostih brojeva od 2 do 9.000.000, jer je
n, na početku postavljeno na 9.000.000.
Code:
while((++p) < n) {
4) E sad…
Code:
for(a[p]?printf("%d ", i = p):0; p < 45000 && i*p < n; a[i++ * p] = 0);
U ovoj petlji je brojač
i. Na početku u izrazu za inicijalizaciju, proverimo da li je broj
p prost i ako jeste ispišemo ga. I usput dodelimo brojaču vrednost
p.
Code:
a[p]?printf("%d ", i = p):0; <=> if (a[p] == 1) { printf("%d ", p); i = p; }
Ova
for petlja u suštini eliminiše sve umnoške datog broja
p od njegovog kvadrata do 9.000.000 (postavi u nizu
a na njihovo mesto
0). Umnošci manji od kvadrata su eliminisani u ranijim petljama.
Code:
a[(i++) * p] = 0
I petlja se vrti sve dok
p*i ne postane veće od n (sve dok ne probijemo 9.000.000). Prvi uslov je postavljen da ne bi probili granice integer-a kada množimo
i*p, u suštini smo mogli staviti i
p < sqrt(9.000.000) jer za veće brojeve nema smisla raditi eliminaciju.
I to bi otprilike bilo to… A kada se sve sastavi dobijemo…
Code:
#include <stdio.h>
int main(){
int a[9000000], i = 9000000, n = i, p = 1;
while (--i) a[i] = 1;
while((++p) < n) {
if (a[p] == 1) printf("%d ", p);
for(i = p; p < 3000 && i*p < n; a[(i++) * p] = 0);
}
return 0;
}