lunes, 14 de abril de 2014

Números primos, hilos y ¿un break en el for?

Ola ke ase, como ejercicio pendiente para esta semana santa de un muy amable profesor, el cual no voy a nombrar por respeto pero si voy a agradecer (irónicamente) la tarea para realizar durante nuestro preciado descanso académico, ya que me ha hecho reflexionar joder... Siempre me han dicho, NI SE TE OCURRA PONER UN BREAK EN UN FOR, y así obedecí, jamás lo había usado pero esta vez no ha sido así:

El ejercicio plantea lo siguiente, tal cual lo voy a escribir:

 2-A.-Hacer un programa que ayude a crear la lista de los 100 primeros números primos, mediante 4 hilos. Cada hilo buscará el siguiente número natural, y si éste es primo lo deberá almacenar en un vector que contendrá los numeros primos obtenidos. Intentar evitar que se almacenen números primos repetidos. Al acabar su ejecución se debe mostrar el resultado acumulado en el vector de primos. Buscar la estrategia más óptima.

No es complicado, de hecho, es fácil pero aunque me redunde me resulta un hecho paradójico lo siguiente:

1º Creo un nuevo proyecto en el Eclipse y una nueva clase llamada Ejer2A.
2º Antes de agregar el método main pienso lo que necesito;

a) Variables globales para el número de números primos a buscar (nPrimos).
b) Vector que almacenará los números primos (primos[]).
c) Contador que recorrerá los números que sean necesarios (contador).
d) El número primo Actual (primoActual).
e) El índice del vector (indiceVector).

3º Como sabemos para usar los hilos (Threads) necesitamos extender la clase que hemos creado a la clase Thread. public class Ejer2A extends Thread
4º Realizo una sobrecarga del método run para que haga lo que yo quiero, que en este caso será llamar otro método en synchronized para que los 4 hilos no choquen.
5º Ahora si, escribo el método main...

Código:


Todo es fácil y bonito, esto me da el siguiente resultado con un i5 a 2,8Ghz y 4GB de RAM.



Ahora, dentro del método primos existe un for que comprueba si el siguiente valor es primo recorriendo todos los números hasta el valor actual y comprobando si su resto es 0 y además un for que recorre el vector de números primos y comprueba que no coincida ninguno con el valor actual:
for(int i=2;i<contador;i++)if(contador%i==0)primo=false;
for(int n:primos) if(n==primoActual) repetidos=true;
Cual es el problema, que si se repite en la segunda posición y hay cuatro, aunque me asigne el booleano a true el for va a seguir, por lo que es tiempo perdido, del mismo modo ocurre al comprobar si es primo o no. Si añado un break en estos for ocurre lo siguiente:
for(int i=2;i<contador;i++){ if(contador%i==0){ primo=false; break; } }
for(int n:primos){ if(n==primoActual){ repetidos=true; break; } }
Se ve a simple vista, se que es una mala práctica añadir un break dentro de un for, pero en este caso existe una excepción...
Si me animo lo haré con un Iterator y el método hasNext() aunque me da a mi que al construir un nuevo objeto voy a ralentizar aun más el procesamiento.



No hay comentarios:

Publicar un comentario