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);
          }
        }
    }
}

45 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. import java.util.*; //Añade utilidades a nuestro código
      import java.io.IOException;

      public class MyClass {
      public static void main(String args[]) {

      Scanner lector = new Scanner(System.in); //Utilidad de interacció

      System.out.println("Ingresar un numero:"); //Utilidad para escribir en pantalla
      int m = lector.nextInt(); //nextInt recupera un valor entero desde teclado
      lector.nextLine();

      int n = 0;
      int c = 0;
      int d = 0;
      int f = 0;

      do{
      f = m - 1;
      n = n + 1;
      c = m % n;
      if (c == 0){
      d = d + n;
      }

      }while (n != f);

      if (d == m){
      System.out.println("el numero es perfecto");
      }else{
      System.out.println("el numero no es perfecto");
      }

      }
      }

      Eliminar
    5. aca para los numeros entre el 1 y 1000
      import java.util.*; //Añade utilidades a nuestro código

      public class MyClass {
      public static void main(String args[]) {

      Scanner lector = new Scanner(System.in); //Utilidad de interacció

      System.out.println("Empezando listado:"); //Utilidad para escribir en pantalla
      int m = 1;
      do{
      m = m + 1;
      int n = 0;
      int c = 0;
      int d = 0;
      int f = 0;
      do{
      f = m - 1;
      n = n + 1;
      c = m % n;
      if (c == 0){
      d = d + n;
      }
      }while (n != f);
      if (d == m){
      System.out.println("el numero perfecto es: " + m);
      }
      }while(m <= 1000 );



      }
      }

      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
  19. oye disculpa y como mande a llamar ese mismo metodo desde otra clase?.
    Me refiero a tener una clase ejemplo donde se haga el metodo y clase principal donde se mande a llamar

    ResponderEliminar
    Respuestas
    1. Creando un objeto de la clase ejemplo y a través de él llamar al método

      Eliminar
  20. Por qué según inicialices la suma funciona o no el programa, no acabo de compenderlo porque lo hice poniendolo al inicio, y no funciona

    ResponderEliminar
  21. me gustaria un programa que hiciese lo mismo pero con menor costo pq si usas numeros mayores que 200000 por ejemplo el tiempo de ejecucion es enorme

    ResponderEliminar
  22. Hola el programa de los números del 1 al 1000 está bien? Es que cuando lo hago como tu lo haces no me muestra nada.

    ResponderEliminar
  23. Cómo podría hacer un ciclo que cuente los números perfectos del 1 al 1000 de manera iterativa? :C

    ResponderEliminar
  24. Diseñe una función que encuentre el primer número perfecto mayor que 28 (o un número n dado). Un número es perfecto si coincide con la suma de sus divisores (excepto él mismo). Por ejemplo, 28 es perfecto ya que 28 = 1 + 2 + 4 + 7 + 14. en python.

    ResponderEliminar
  25. Buenas Alguien me puede ayudar con este ejercicio?? AYUDEMEN
    1= permita ingresar 2 numeros, verificar si dichos numeros son primos gemelos
    2= permite ingresar 3 numeros, verificar si la sumatoria de estos numeros es un numero primo y perfecto a la vez?
    3= permite ingrezar 1 numero y precentar la serie de fivonacia asta el 100

    ResponderEliminar
    Respuestas
    1. //Primos gemelos
      import java.util.*; //Añade utilidades a nuestro código
      import java.io.IOException;

      public class MyClass {
      public static void main(String args[]) {

      Scanner lector = new Scanner(System.in); //Utilidad de interacció

      System.out.println("Ingresar un numero:"); //Utilidad para escribir en pantalla
      int n1 = lector.nextInt(); //nextInt recupera un valor entero desde teclado
      lector.nextLine();

      System.out.println("Ingresar otro numero:"); //Utilidad para escribir en pantalla
      int n2 = lector.nextInt(); //nextInt recupera un valor entero desde teclado
      lector.nextLine();

      int n = 0;
      int c = 0;
      int d = 0;
      //Comprobar si es un numero primo el primero
      do{
      c = c + 1;
      n = n1 % c;
      if (n == 0){
      d = d + 1;
      }
      }while (c <= n1);
      //Comprobar si es un numero primo el segundo
      int d1 = 0;
      int c1 = 0;
      int n4 = 0;
      do{
      c1 = c1 + 1;
      n4 = n2 % c1;
      if (n4 == 0){
      d1 = d1 + 1;
      }
      }while (c1 <= n2);
      //Comprobar si son gemelos
      int n3;
      if (d == 2 && d1 == 2){
      n3 = n1 - n2;
      if(n3 == -2 || n3 == 2){
      System.out.println("los numeros: "+n1+" y "+n2+" son primos gemelos");
      }else{
      System.out.println("los numeros: "+n1+" y "+n2+" son primos pero no gemelos");
      }
      }else{
      if(d != 2){
      if (d1 == 2){
      System.out.println("El numero: "+n1+" no es primo y el "+n2+" es primo");
      }else{
      System.out.println("los numeros: "+n1+" y "+n2+" no son primos");
      }
      }else{
      if (d == 2){
      System.out.println("El numero: "+n2+" no es primo y el "+n1+" es primo");
      }else{
      System.out.println("los numeros: "+n1+" y "+n2+" son primos");
      }
      }
      }

      }
      }

      Eliminar
    2. //La suma de tres numeros, ver si es primo y perfecto
      import java.util.*; //Añade utilidades a nuestro código
      import java.io.IOException;

      public class MyClass {
      public static void main(String args[]) {

      Scanner lector = new Scanner(System.in); //Utilidad de interacció

      System.out.println("Ingresar un numero:"); //Utilidad para escribir en pantalla
      int n1 = lector.nextInt(); //nextInt recupera un valor entero desde teclado
      lector.nextLine();

      System.out.println("Ingresar un segundo numero:"); //Utilidad para escribir en pantalla
      int n2 = lector.nextInt(); //nextInt recupera un valor entero desde teclado
      lector.nextLine();

      System.out.println("Ingresar un tercer numero:"); //Utilidad para escribir en pantalla
      int n3 = lector.nextInt(); //nextInt recupera un valor entero desde teclado
      lector.nextLine();

      int s = 0,n = 0,c = 0,d = 0;
      s = n1 + n2 + n3;
      //Comprobar si es un numero primo el primero
      do{
      c = c + 1;
      n = s % c;
      if (n == 0){
      d = d + 1;
      }
      }while (c <= s);
      //Comprobar si es perfecto
      int n4 = 0, d1 = 0,f = 0;
      do{
      f = s - 1;
      n4 = n4 + 1;
      c = s % n4;
      if (c == 0){
      d1 = d1 + n4;
      }
      }while (n4 != f );

      if (d == 2){
      if (d1 == s){
      System.out.println("La suma de los numeros: "+n1+" "+n2+" "+n3+" da un primo y un numero perfecto");
      }else{
      System.out.println("La suma de los numeros: "+n1+" "+n2+" "+n3+" da un primo y no es un numero perfecto");
      }
      }else{
      if (d1 == s){
      System.out.println("La suma de los numeros: "+n1+" "+n2+" "+n3+" no da un primo y es un numero perfecto");
      }else{
      System.out.println("La suma de los numeros: "+n1+" "+n2+" "+n3+" no da un primo y no es un numero perfecto");
      }
      }
      }
      }

      Eliminar
  26. buenas dias, quien me puede ayudar con este algortimo
    elabore un algoritmo que calcule usando un menu si cada uno cojuntoi de numeros es : par,primo y perfecto

    ResponderEliminar