Números primos de 2 a 1000

Una simple aplicación que imprime en pantalla números primos entre 2 y 1000.

Creo un ArrayList donde almaceno el número 2. Despues, creo un bucle de 3 a 1000 de dos en dos (por que no merece la pena mirar si un número par es primo, porque todos son divisibles por 2). Cada número es pasado como argumento a una función que evalua si un número es o no primo, si lo es, lo añade al ArrayList primos, si no lo es, simplemente no hace nada. Para terminar, imprime en pantalla cada uno de los elementos del ArrayList primos, y para terminar, cuantos hay.

En la función isPrimo, se coge como parámetro un número entero. Crea un bucle que va desde el primer elemento hasta la raíz cuadrada del número pasado como parámetro. Sé que el código está hecho de tal forma que siempre evaluará un número más de lo que debería (para 3, evaluaría el 2, que es mayor a sqrt(3). Para 5, evaluaría el 3 que es mayor a sqrt(5). Para 7, evaluaría el 3 también, ...). Si en algún momento, el resto de la división entre el número y alguno de los números primos es 0 (que el número primo es uno de las factores del número a analizar), devuelve false. Si después de hacer todas las comprobaciones, ninguno ha sido factor, señal de que el número a analizar era primo, por lo que devuelve true.


import java.util.ArrayList;
import java.util.Iterator; 

public class Main {
    static ArrayList primos;
    public static void main(String[] args) {
        int i;
        primos = new ArrayList();
        primos.add(2);
        for (i=3;i<1000;i+=2)
        {
            if (isPrimo(i))
                primos.add(i);
        }
        Iterator iter = primos.iterator();
        while (iter.hasNext())
            System.out.println(iter.next());
        System.out.println(primos.size());
    }
    static boolean isPrimo(int num)
    {
        Iterator<integer> iter=primos.iterator();
        boolean fin = false;
        int valor;
        while (iter.hasNext() && !fin)
        {
            valor = iter.next();
            fin = valor >= Math.sqrt(num);
            if ((num % valor) == 0)
                return false;
        }
        return true;
    }
}

De momento, esto no tiene más misterios. La cosa va bien, no me quejo. Todavía no entiendo porque primos e isPrimo tienen que ser abstract, ni qué hace que lo sean. Pero ya lo descubriré.

0 comentarios:

Publicar un comentario