Detección de números perfectos

Sergio Ferrer.

/*Un número perfecto es un número 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 siguientes números perfectos son 28, 496 y 8128.

  • 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

Si se introduce un número muy grande lo que ocurre es que el cálculo de la suma de sus divisores propios positivos es más lento y costoso debido al algoritmo implementado. */


#include <iostream>
using namespace std;

//PROTOTIPO DE LAS FUNCIONES

long long int SumaDivisores(long long int);
int NumeroPerfecto(long long int);

//PROGRAMA PRINCIPAL

int main()
{

 //CABECERA
 cout<<"\n\t // NUMEROS PERFECTOS //"<<endl<<endl;

 long long int N;

 //LECTURA DE DATOS Y DESARROLLO

 cout<<" Escriba el numero que quiere saber si es perfecto : ";
 cin>>N;
 cout<<"\n";

 if (NumeroPerfecto(N) == 0) cout<<"\tLo siento, pero el numero NO es Perfecto "<<endl<<endl;
 else if (NumeroPerfecto(N) == 1) cout<<"\tEnhorabuena, el numero es PERFECTO "<<endl<<endl;

 cout<<"\n\t\t ----------------------------------------"<<endl;
 cout<<"\t\t ----------------------------------------"<<endl<<endl;

return 0;
}

//FUNCION QUE CALCULA LA SUMA DE LOS DIVISORES DEL NUMERO

long long int SumaDivisores(long long int N)
{
 long long int suma = 0;

 for(long long int i=1 ;i<N; i++)
 if((N%i)== 0) suma += i;

 return suma;
}

// FUNCION QUE DETERMINA SI ES PERFECTO O NO

int NumeroPerfecto(long long int N)
{
 if(SumaDivisores(N) == N) return 1;

 return 0;

}
Esta entrada fue publicada en Informática e Internet. Guarda el enlace permanente.

Una respuesta a Detección de números perfectos

  1. Nota: (1) trabajar con “long long int” te ralentiza el cálculo.. basta que trabajes con “int”.
    (2) El algoritmo de la suma de divisores se podría optimizar y así aumentar su velocidad.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s