Saltar al contenido
Portada » Números Perfectos en Java

Números Perfectos en Java

Te mostramos distintos algoritmos para calcular números perfectos en Java. Los números perfectos son aquellos cuya suma de sus divisores (excluyendo el mismo) son el número en sí.

Número perfecto en Java

Todos los números perfectos conocidos son pares. Algunos ejemplos:

n = 9
Los divisores de 9 son el 1 y el 3:
Sumatorio = 1 + 3 = 4 ≠ 9
⇒ 9 no es un número perfecto.
n = 6
Los divisores de 6 son 1, 2 and 3.
Sumatorio = 1 + 2 + 3 = 6 = 6
⇒ 6 es un número perfecto.

Los siguientes números perfectos después del 6 son 28, 496, 8128, 33550336, 8589869056.

Para implementar el algoritmo en Java necesitamos encontrar los divisores de un número.

Solución simple para calcular números perfectos en Java

Una solución sencilla y directa consiste en recorrer todos los números desde 1 a n-1 y comprobar si es un divisor. En caso de que cada número procesado sea un divisor se añade al sumatorio general. Una vez el bucle finaliza, se comprueba si el sumatorio general es el propio número o no. De esta manera podemos generar una lista de números perfectos.

 
class ComprobacionNumerosPerfectos
 {
  
    static boolean esNumeroPerfecto(int n)
    {
        boolean perfecto = false;

        // 1 no es perfecto
        if (n == 1){
            return false;
        }

        int sum = 1;
  
        for (int i = 2; i < n; i++) 
        {
            if (n % i == 0) {
                sum += i;
            }
        }

        if (sum == n) // es numero perfecto
            return true;
  
        return false;
    }
  

    public static void main(String[] args)
    {
        int n = 6;
        
        if (esNumeroPerfecto(n))
            System.out.println(n + " es un numero perfecto");
        else
            System.out.println(n + " no es un numero perfecto");
    }
}

La complejidad computacional del algoritmo es O(n).

Solución Eficiente y optimizada

Una implementación eficiente de este algoritmo consiste en recorrer números hasta la raíz cuadrada de n.

class ComprobacionNumerosPerfectos
 {
  

    static boolean esNumeroPerfecto(int n)
    {

        if (n == 1) // el numero 1 no es un numero perfecto
            return false;
  
        int sum = 1;
  
        for (int i = 2; i * i <= n; i++) 
        {
            if (n % i == 0) {
                
                if (i * i == n)
                    sum += i;
                else
                    sum += i + (n / i);
            }
        }
        
        if (sum == n)
            return true;
  
        return false;
    }
  
    // Driver program
    public static void main(String[] args)
    {
        int n = 6;
        
        if (esNumeroPerfecto(n))
            System.out.println(n + " es un numero perfecto");
        
        else
            System.out.println(n + " no es un numero perfecto");
    }
}

La complejidad computacional de esta implementación es O(√n).


Más algoritmos matemáticas

AlgoritmoDescripción
Sucesión de FibonacciAprende a programar en Java la famosa sucesión de Fibonacci
Números PrimosAlgoritmo de cálculo en Java para saber si un número es primo
FactorialCálculo del factorial de un número en Java
Número PiAprende a calcular Pi en Java
Número eNúmero e, algoritmo en Java
Raíz cuadradaDesarrollo en Java del algoritmo raíz cuadrada
Números PerfectosDetermina en Java si un número es “perfecto”
Conversión binario – hexadecimalConversor binario a hexadecimal en Java
Generación de números aleatoriosGenerar números aleatorios entre 1 y 100, ejemplos prácticos
Matrices en JavaCrea una matriz en Java y manéjala con soltura
Calculadora en JavaEjemplo sencillo para montar una calculadora en java con interfaz básica

Recursos básicos Java

AsuntoDescripción
Tutorial básico y sintaxisTutorial básico Java y sintaxis. Aprende los fundamentos del lenguaje.
Hilos (Threads)Aprende a manejar hilos y las cuestiones básicas de la concurrencia
Funciones LambdaAquí te enseñamos las nociones más importantes para arrancas con funciones lambda
PalíndromosPrograma de ejemplo para el uso de palíndromos en Java.
Máquina Virtual de JavaTe explicamos el funcionamiento de la máquina virtual de java (Java Virtual Machine – JVM)
JDK, JRE y JVMDiferencias entre el JDK, JRE y JVM.
Mejores libros Java en EspañolHazte con los mejores libros Java para aprender paso a paso y profundizar en las mejores prácticas
TensorFlowManejo del API de TensorFlow para la construcción de grafos de operaciones y su ejecución
Tutorial Log4jTutorial para el manejo de Log4j, herramienta ágil y flexible para la gestión de Logs en Java
Java SecurityEntiende y aplica las posibilidades que da Java para mantener la seguridad
Tutorial JConsoleAprende los conceptos básicos de monitorización de procesos Java con JConsole
JavaFXTutorial de JavaFX, librería gráfica moderna para construcción de GUIs en móvil, escritorio y web.
Estructuras de datos en JavaExplicación y ejemplos de las estructuras de datos más importantes: listas, pila, cola, arbol.
JavaapiConjunto de clases, interfaces, métodos y paquetes que forman parte de la plataforma Java estándar
Algoritmo HuffmanMétodo eficiente para codificar datos, asignando códigos más cortos a los caracteres más frecuentes