Entrada destacada

Como usar enums en Android, kotlin

Cómo calcular números perfectos en C++

Un número perfecto es un número natural que se obtiene de la suma de sus divisores propios positivos, que en ocasiones se les llama números amigos.
Un ejemplo de número perfecto es el 6, ya que sus divisores propios positivos son el 1, 2 y 3 y la suma de estos 1 + 2 + 3 = 6.
También son perfectos: 
28     = 1 + 2 + 4 + 7 + 14
496   = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248
8128 = 1 + 2 + 4 + 8 + 16 + 32 + 64 + 127 + 254 + 508 + 1016 + 2032 + 4064

La forma en que podemos implementar un algoritmo para obtener números perfectos se describe en la siguiente figura.

De manera general,  
  • Se recorre una lista de números, empezando desde cero hasta un limite dado. 
  • Dentro de este bucle se hace otro, el cual empieza desde la mitad del número anterior hasta cero, esto podría ser inverso osea de cero a mitad, pero se opto de esta manera para dar un ejemplo más variado. 
  • Dentro de este ultimo bucle se comprueba si los números que componen, al número que queremos saber si es perfecto, es un divisor propio, obteniendo su modulo y comparando que el resultado sea igual a cero.
  • En caso de ser un divisor perfecto, se agrega a el acumulador de la suma de los divisores. 
  • Una vez se han terminado de sumar los divisores del número, se comprueba si la suma de los divisores es igual al número que se analiza, en caso de ser iguales se imprime que es un número perfecto.
  • Se limpia el valor de suma, y se vuelve hacer para el resto de los números del rango. 

Código fuente

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>

using namespace std;

int main(){
    //definicion de variables
    int auxEntero = 0;
    int rangoBusqueda = 0;
    cout<<"PROGRAMA QUE BUSCA NUMEROS PERFECTOS.\n\n";
    cout<<"Rango de busqueda (Ingrese un numero entero):";
    cin>>rangoBusqueda;

    for(int i = 1; i <= rangoBusqueda; i++){
        if(i % 2 == 0){
            for(int j = (i / 2); j >= 1 ; j--){
                if( i % j == 0){
                    auxEntero = auxEntero + j;
                }
            }
            if(auxEntero == i)
                cout<<"Número Perfecto "<<auxEntero <<endl;
        }
        auxEntero = 0;
    }
    return 0;
}


     

Comentarios

  1. Hola buenas, estube varios dias intentando realizar este ejercicio para la universidad pero no podia, y eso que tenia ideas parecidas a las tuyas. lo que no logre entender fue el punto dos del algoritmo, me explicarias porque el segundo bucle arranca cuando i%2==0, no logre entender cual es su funcion

    ResponderEliminar
  2. bueno,ya es tarde pero es el mod y eso va a comprobar que para todo divisor el residuo debe ser 0

    ResponderEliminar
  3. este programa tiene un problema de rango ya que solo calcula los 4 primeros números perfectos, después de eso no calcula mas

    ResponderEliminar
    Respuestas
    1. Hola, no es que solo calcule los cuatro primeros. En c++ las variables tipo "int" solo pueden almacenar datos en un rango -32786 a 32767.

      Eliminar

Publicar un comentario