Número perfecto en java

Qué es un número perfecto?

Un número es perfecto si es igual a la suma de todos sus divisores positivos sin incluir el propio número.

Por ejemplo, el número 6 es perfecto. 

El 6 tiene como divisores: 1, 2, 3 y 6 pero el 6 no se cuenta como divisor para comprobar si es perfecto.

Si sumamos 1 + 2 + 3 = 6 

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

En esta entrada vamos a desarrollar el algoritmo para comprobar si un número es perfecto.
El programa pide por teclado un número y muestra si es perfecto o no. mediante un bucle for sumaremos los divisores del número. Al final si esta suma es igual al número mostraremos el mensaje correspondiente.

Programa java para calcular si un número es perfecto:

import java.util.Scanner;
public class NumeroPerfecto {
    public static void main(String[] args) {
        int i, suma = 0, n;
        Scanner sc = new Scanner(System.in);
        System.out.println("Introduce un número: ");
        n = sc.nextInt();
        for (i = 1; i < n; i++) {  // i son los divisores. Se divide desde 1 hasta n-1
            if (n % i == 0) {
                suma = suma + i;     // si es divisor se suma
            }
        }
        if (suma == n) {  // si el numero es igual a la suma de sus divisores es perfecto
            System.out.println("Perfecto");
        } else {
            System.out.println("No es perfecto");

        }
    }
}



Utilizando el algoritmo anterior vamos a escribir ahora el programa Java que muestre los números perfectos entre 1 y 1000


public class NumerosPerfectos1a1000 {
    public static void main(String[] args) {
        int i, j, suma;
        System.out.println("Números perfectos entre 1 y 1000: ");
        for(i=1;i<=1000;i++){    // i es el número que vamos a comprobar
            suma=0;
            for(j=1;j<i;j++){  // j son los divisores. Se divide desde 1 hasta i-1
                 if(i%j==0){
                    suma=suma+j;     // si es divisor se suma
                 }
            }
          if(i==suma){           // si el numero es igual a la suma de sus divisores es perfecto
                 System.out.println(i);
              }
        }
    }
}

28 comentarios:

  1. muy bueno el programa...!!!!!

    ResponderEliminar
  2. como puedo realizar el ingreso de un numero binario para obtener su equivalente decimal

    ResponderEliminar
  3. Hola, me ah saltado un error con mi código, realizandolo como tu lo has hecho me va de maravillas, pero se me ocurrió meterle la función de repetición (do{ Código } while) Bueno, lo eh hecho y me fue bien pero al finalizar me salta el error "Sintax error, inser while (expresion;)" . Quisiera saber cuales son los errores en mi código:

    package EnProceso;

    import java.util.*;
    import java.io.*;

    public class Práctica {

    public static void main (String[] ars)throws IOException{

    Scanner sc = new Scanner (System.in);
    int i, n, suma = 0;
    char car;
    do { System.out.println("Ingrese el número:");
    n = sc.nextInt();
    for (i = 1; i < n; i++){
    if (n%i==0){
    suma = suma + i;
    }
    }
    if (suma == n){
    System.out.println(n+" es un número perfecto");
    else{
    System.out.println(n+" no es un número perfecto");

    System.out.println("¿Desea repetir? (S para repetir | Otro para finalizar))");
    car = (char) System.in.read();

    }while (car == 's' | car == 'S');
    System.out.println("Programa finalizado. Gracias por usar nuestro sistema");


    }



    }

    ResponderEliminar
    Respuestas
    1. El operador OR es una doble barra || Modíficalo y comprueba si te funciona

      Un saludo y gracias por seguir el blog.

      Eliminar
    2. Hola, hace rato que no me estaba en Java, por los deberes, pero ayer pude volver, y me acorde de este tema, lo quise arreglar, poniendo dos barras
      }while (car == 's' || car == 'S');
      Pero no ah resultado, salta el mismo error, o eso no es el OR? Podrías ayudarme, gracias de antemano.

      Eliminar
    3. Pues yo estoy empezando con java, creo que te falta algún } aquí y allá.

      public static void main (String[] args)throws IOException {
      Scanner sc = new Scanner (System.in);
      int i, n, suma = 0;
      char car = 0;

      do {
      System.out.println("Ingrese el número:");
      n = sc.nextInt();
      for (i = 1; i < n; i++) {
      if (n%i==0) {
      suma = suma + i;
      }
      }

      if (suma == n) {
      System.out.println(n+" es un número perfecto");
      }
      else {
      System.out.println(n+" no es un número perfecto");
      System.out.println("¿Desea repetir? (S para repetir | Otro para finalizar))");
      car = (char)System.in.read();
      }
      }while(car == 's' || car == 'S');
      System.out.println("Programa finalizado. Gracias por usar nuestro sistema");

      }
      }

      De todas formas al hacer esto, en la variable "car" me salía un error de que no estaba inicializada, así que tuve que ponerle el valor de cero. Aunque he leído por ahí que esto no es recomendable.

      Sorry, me he colado respondiendo con un post.

      Eliminar
  4. Pues yo estoy empezando con java, creo que te falta algún } aquí y allá.

    public static void main (String[] args)throws IOException {
    Scanner sc = new Scanner (System.in);
    int i, n, suma = 0;
    char car = 0;

    do {
    System.out.println("Ingrese el número:");
    n = sc.nextInt();
    for (i = 1; i < n; i++) {
    if (n%i==0) {
    suma = suma + i;
    }
    }

    if (suma == n) {
    System.out.println(n+" es un número perfecto");
    }
    else {
    System.out.println(n+" no es un número perfecto");
    System.out.println("¿Desea repetir? (S para repetir | Otro para finalizar))");
    car = (char)System.in.read();
    }
    }while(car == 's' || car == 'S');
    System.out.println("Programa finalizado. Gracias por usar nuestro sistema");

    }
    }

    De todas formas al hacer esto, en la variable "car" me salía un error de que no estaba inicializada, así que tuve que ponerle el valor de cero. Aunque he leído por ahí que esto no es recomendable.

    ResponderEliminar
  5. public static int perfecto(int tope){
    int x,acum=0;
    for (x=1;x<=tope/2;x++){
    if(tope%x==0){
    acum++;
    }
    }
    return acum;
    }


    //que le parece esto

    ResponderEliminar
  6. aqui está el codigo arreglado, lo compilé con el netbeans y funciona, solo tuve que dos signos de llave de cierre, uno en el if y otro en el else, al principio me pedia que inicializara el char pero al agregarle esas dos llaves ya no me pide la inicializacion de char. dejaré el codigo.
    import java.util.*;
    import java.io.*;

    public class practica36 {

    public static void main (String[] ars)throws IOException{

    Scanner sc = new Scanner (System.in);
    int i, n, suma = 0;
    char car;
    do { System.out.println("Ingrese el número:");
    n = sc.nextInt();
    for (i = 1; i < n; i++){
    if (n%i==0){
    suma = suma + i;
    }
    }
    if (suma == n)
    {
    System.out.println(n+" es un número perfecto");
    }
    else{
    System.out.println(n+" no es un número perfecto");
    }
    System.out.println("¿Desea repetir? (S para repetir | Otro para finalizar))");
    car = (char) System.in.read();

    }while (car == 's' || car == 'S');
    System.out.println("Programa finalizado. Gracias por usar nuestro sistema");


    }

    ResponderEliminar
    Respuestas
    1. Hola, muchas gracias por el código arreglado. Por cierto, por si alguien quiere usar este código se dará cuenta que la primera vez que se usa el programa anda bien, pero al repetir (Repetir no reiniciar) el programa este no calcula bien los números perfectos. La solución es simple y ha sido un error del que no me había percatado al crear el código:

      Scanner sc = new Scanner (System.in);
      char car;
      int i, n, suma = 0;
      do {
      System.out.println("Ingrese el número:");
      n = sc.nextInt();

      En esta parte del código vemos el código inicial de repetición (do { ) luego de dar los valores a los int. Al repetir el programa, los int. tenían el valor final, es decir que no volvía al valor inicial ( 0 ). Se arregla poniendo el código int por debajo del código de repeticón.

      Scanner sc = new Scanner (System.in);
      char car;
      do {
      int i, n, suma = 0;
      System.out.println("Ingrese el número:");
      n = sc.nextInt();

      Gracias por la ayuda en este código Pasisica.

      Eliminar
  7. necesito que me ayuden tengo una tarea en java que me piden lo siguente 3. Un número entero positivo se dice perfecto cuando es igual a la suma de sus divisores exceptuando al mismo. Por ejemplo 6=1+2+3 y 28=1+2+4+7+14 son números perfectos. Escribir un programa que:
    a. Pida un número entero n al usuario
    b. Muestre por pantalla la lista de todos los números perfectos menores o iguales que n.
    les agradeceria mucho que me ayudaran

    ResponderEliminar
  8. me podrian ayudar con este ejercicio: 1. Diseñar y codificar un algoritmo que permita al ordenador adivinar un número comprendido entre 0 y 100 que haya pensado el usuario. Como salida, se mostrará el número de preguntas necesarias para adivinar el número

    ResponderEliminar
  9. public static void main(String[] args) {
    int suma = 0;

    Scanner sc = new Scanner(System.in);
    System.out.print("número inicial: ");
    int n1 = sc.nextInt();

    System.out.print("número final: ");
    int n2 = sc.nextInt();

    System.out.println();
    System.out.println("números perfectos: ");

    do {
    if (getPerfecto(n1))
    System.out.println(n1);

    n1++;
    } while (n1 <= n2);

    }

    private static boolean getPerfecto(int numero) {
    int suma = 0;

    for (int i = 1; i < numero; i++) {
    if (numero % i == 0) {
    suma += i;
    }
    }

    return (suma == numero);
    }

    ResponderEliminar
  10. alguien tiene ese codigo pero en recursivo ?????

    ResponderEliminar
  11. buenas noches !
    alguien me podria decir como orientar este codigo hacia objetos?

    ResponderEliminar
  12. buenas noches !
    alguien me podria decir como orientar este codigo hacia objetos?

    ResponderEliminar
  13. me podrían ayudar con un problema orientado a objetos???

    /*se requiere un programa para crear un cuadro que el usuario
    decida el tamaño del cuadro pero solo aparesca su perimetro
    Ejemplo:
    DAME EL TAMAÑO DEL CUADRO
    5

    * * * * *
    * . . . .*
    * . . . .*
    * . . . .*
    * * * * *


    */

    Scanner leer= new Scanner(System.in);

    System.out.println("DAME EL TAMAÑO DEL CUADRO");
    int A = leer.nextInt();

    for (int x = 0; x < A; x++)
    {

    for (int y = 0; y < A; y++)
    {
    System.out.print(" * ");

    }
    System.out.println("");




    }

    ResponderEliminar
  14. ayuda tengo un problema en eclipse es el mismo problema pero para una aplicación para androit ayuda

    ResponderEliminar
  15. ayuda necesito hacer esto pero en java desktop applicaction es en visual

    ResponderEliminar
  16. ¿Como obtendría el numero de números perfectos que deseo ver?
    ejemplo: quiero los primeros 3 números perfectos y me resuelva 6, 28, 496.
    Gracias.

    ResponderEliminar
  17. lo mismo pero con vectores o array
    import java.util.Scanner;
    public class arregloprimoono {

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner ing =new Scanner (System.in );
    int n,i,ii,s=0;
    int v[]=new int [1000];
    System.out.println("ingrese limite ");
    n=ing.nextInt();
    System.out.println("ingrese numeros");
    for (i=1;i<=n;i++)
    {
    v[i]=ing.nextInt();
    for (ii=1;ii<v[i]-1;ii++)
    {v[ii]=v[i];
    if(v[ii]%ii==0){s=s+ii;}
    }
    if(s==v[i])
    {System.out.println("es perfecto");s=0;}
    else
    {System.out.println("no es");s=0;}
    }


    }

    }

    ResponderEliminar
  18. Un soporte se considera que es uno cualquiera de los siguientes caracteres: (,), {,}, [o].
    Dos soportes se considera que son un par coincidente si ([{produce) a la izquierda de un corchete de cierre (es decir,),, o, o]} es decir, (,) el soporte de una abertura del mismo tipo exacto. Hay tres tipos de parejas de corchetes: [], {}, y ().
    Un par de juego de corchetes no está equilibrado si el conjunto de soportes que encierra no se corresponden. Por ejemplo, {[(])} no es equilibrada porque el contenido en entre {y} no están equilibrados. El par de corchetes encierra un único soporte, la apertura desequilibrada, (y el par de paréntesis encierra un solo corchete de cierre, desequilibrado,].
    Según esta lógica, decimos una secuencia de tramos se considera equilibrada si se cumplen las siguientes condiciones:
    No contiene soportes incomparables.
    El subconjunto de soportes encerrados dentro de los confines de un par emparejado de soportes es también un par emparejado de soportes.
    cadenas dadas de soportes, determine si cada secuencia de paréntesis es equilibrada. Si una cadena es equilibrada, imprimir SÍ en una nueva línea; de lo contrario, no imprima en una nueva línea.
    Formato de entrada
    La primera línea contiene un solo número entero, que denota el número de cadenas.
    Cada línea de las líneas subsiguientes se compone de una sola cadena, que denota una secuencia de soportes.
    restricciones
    , Donde es la longitud de la secuencia.
    Cada carácter en la secuencia será un soporte (es decir, {,}, (,), [y]).
    Formato de salida
    Para cada secuencia, imprimir o no la serie de soportes se equilibra en una nueva línea. Si los soportes están equilibrados, imprimir SÍ; de lo contrario, no imprima.
    Ejemplo de entrada
    3
    {[()]}
    {[(])}
    {{[[(())]]}}
    Ejemplo de salida

    NO

    Explicación
    La cadena {[()]} cumple ambos criterios para ser una cadena equilibrada, por lo que se imprime SÍ en una nueva línea.
    La cadena {[(])} no es equilibrada, ya que los soportes encerrados por los pares coincidentes [(] y (]) no están equilibrados.
    La cadena {{[[(())]]}} cumple ambos criterios para ser una cadena equilibrada, por lo que se imprime SÍ en una nueva línea.
    alguien que me ayude

    ResponderEliminar