public class RezolvareFAIMA {
private static final int MAX = 120;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
//Definim un vector cu Da/Nu (valori boolean) unde salvam, pentru fiecare
//numar natural care ne intereseaza concluzia este compus (DA, true) sau este prim (NU,false)
//Fiindca ciurul lui Eratostene marcheaza numele compuse (neprime), la inceput singura informatie
//pe care o avem e ca toate numerele sunt prime. Vectorul nostru asadar contine MAX pozitii, numerotate
//de la 0 la MAX-1 cu valoarea NU, sau false
boolean[] p = new boolean[MAX];
//iteram toate numerele de la 2 la MAX/2+1; orice numar peste MAX/2+1 nu mai poate fi de ajutor,
//pentru ca nu mai elimina
//vreun numar mai mic decat MAX; putem sa iteram si pana la MAX, dar e o irosire de timp,
//pentru MAX foarte mare, acest lucru conteaza
for (int i = 2; i < MAX / 2 + 1; i++) {
//iteram printre numerele mai mici decat i, interesul fiind ca orice combinatie de
//2 numere i,j sa fie atinse o singura data (stiind ca inmultirea e comutativa, daca
//i*j a setat deja pozitia din vector, j*i e o operatie inutila, nu aduce nimic nou;
//trebuie sa avem grija de asemenea ca pe noi ne intereseaza doar numerele prime/neprime
//pana la MAX, deci daca i*j depaseste MAX, vrem sa ne oprim din iterat; putem sa scriem si asa:
//for(int j=2;j<=i&&j*iMAX, oricare ar fi k>j, i*k>MAX
for (int j = 2; j <= i; j++) {
if(i*j>=MAX){
break;
}
//setam pozitia i*j ca fiind DA/true, adica i*j este cu siguranta un numar neprim
p[i * j] = true;
}
}
//Iteram din nou de la 2 la MAX, parcurgem vectorul si afisam pozitiile prime,
//adica acelea in care p[i] este fals;
//"!" este un operator binar, el se aplica oricarei valori booleene, de exemplu si celor din
//vectorul nostru; in acest caz, if(!p[i]) este acelasi lucru cu if(p[i]==false); folosind
//aritmetica logica din liceu, mi-ar face placere sa imi explicati de ce.
for (int i = 2; i < MAX; i++) {
if (!p[i]) {
System.out.println(i);
}
}
}
0 comentarii:
Trimiteți un comentariu