martes, 22 de mayo de 2012

Los 5 números perfectos [Java]

¡Hola! ¿Cómo te encuentras? espero que bien. Hoy por la mañana llego una chica y me preguntó algo que hace tiempo me dio un gran dolor de cabeza, le habian encargado hacer una clase en Java que calculara los 5 primeros números perfectos, el caso fue que yo estaba un poco ocupado y no pude terminar de apoyarla, aparte que yo mismo muy dentro de mi recuerdo que cuando me encargaron eso, jamas lo terminé.

En la tarde [Osea en estos momentos] ya con todo el tiempo de mundo me puse a realizar el algoritmo, comencé haciendo que calculara el primero, despues el segundo y así hasta el quinto, éste último tardo mucho por cierto, mas abajo coloco una captura para que te fijes cuanto tardo el proceso para encontrarlo.

Un número perfecto es un numero natural que es igual a la suma de sus divisores propios positivos, sin incluirse él mismo. Dicho de otra forma, un número perfecto es aquel que es amigo de sí mismo.

Así, 6 es un número perfecto, porque sus divisores propios son 1, 2 y 3; y 6 = 1 + 2 + 3.

Los primeros seis números perfectos son los siguientes:
  1. 6
  2. 28
  3. 496
  4. 8128
  5. 33550336
  6. 8589869056
Al fin el sexto tardaria horas en aparecer, me dio pereza esperar. Según un matemático muy sonado que no recuerdo su nombre calculó que las cifras de los números perfectos terminaba en 6 y despues en 8 pero, en el sexto caso fue la IOexception perdon la excepción [Se me atravesó una excepción].

[Modificación hecha a las 5:59 pm: Distinguido visitante te comento que llevo cerca de media hora esperando a que aparesca el quinto número y apenas va en 3000000 asi que lo recortaré hasta el cuarto, si deseas que calcule hasta el quinto lee la nota que dejo en la parte final de la publicación.]

Ahora el código:

/**
*
* @author jesus
*/
public class NumerosPerfectos {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        int np=1;
        String numerosp="";
        int n=1;
        int suma=0;
        while(np<5)
        {
            n++;
            for(int x=1;x<n;x++)
            {
                if(n%x==0)
                {
                   suma=suma+x;
                }
            }
            if(suma==n)
            {
                np=np+1;
                numerosp=numerosp+suma+",";
                suma=0;
            }
            else
            {
                System.out.println(n+"no es Perfecto");
                suma=0;
            }
        }
        System.out.println("No. Perfecto: "+numerosp);
    
    }
}

El resultado será el siguiente [Decidí colocar mejor el texto y no una captura, disculpa n_n] : 

(...)
No. Perfecto: 6,28,496,8128,
GENERACIÓN CORRECTA (total time: 4 seconds)

Nota: Si deseas que calcule el quinto número perfecto cambia while(np<5) a while(np<6), prepara una taza de cafe, corta un trozo de pan, coloca tu mejor silla [Alcochonada es mejor] y espera unas 2 horas.

    Choose :
  • OR
  • To comment
4 comentarios:
Write comentarios
  1. Muchas gracias amigo interesante aporte !!

    ResponderEliminar
  2. jajajajajajajaja me parece muy chistoso eso de esperar 2 horas por el quinto

    ResponderEliminar