Rezolvare - Laborator FAIMA #1 / An 1 Semestru 1


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: