Numeros perfectos

N

Wenas, tengo una duda, tengo k hacer un progrma de lso numeros perfectos en c, el caso es que no se ni por donde cogerlo.Pa quien no lo sepa un numero perfecto es que las suma de sus divisiores enteros da ese mismo numero:
Ejemplo: 6 = divisible entre 3,2 y 1 es decir 3+2+1= 6. Pues eso es un numero perfecto. Si me podriais ayudar me hariais un gran favor ya que no se por donde empezar.

DArgo

esto que es para alguna practica de la asignatura de informatica? xD

parece que el programa ha de ser recursivo...

B

Tiene toda la pinta de ser un programa recursivo.
Si no sabes lo que es recursivo es que la propia rutina es llamada a sí misma, almacenándose los datos en la pila del computador. La idea seria hacer una cosa del estilo

int factorial (num) {
if (num == 0) return 1;
else return num*factorial(num-1);
}

este es un ejemplo de como hacer el factorial de forma recursiva, pero en tu caso no se exactamente como hacerlo. Que es para una practica? jejeje, yo tambien he pasado por eso. Que tengas suerte y si se me ocurre algo lo posteo aqui!

N

Si, es una puta practica, pero eso de recursivo todavia no lo he dao, asique.. no kreo k me sirva de muxo ya k si le pongo eso me dira EIN? como sabes tu eso?jaajja asik no se me seguire comiendo el coco.

DArgo

Ves haciendo divisiones sucesivas hasta que llegues a 1... (eso si no puedes hacer recursividad...). Voy a pensarlo y si me sale te lo paso :P

N

Muchas gracias haber si entre todos los sacamos, porque no ha manera jaja

JuAn4k4

Lo tengo resuelto en Ada, si te sirve :\

Te pongo mas o menos como iria:
numero es el numero que mete el operador.
n es el numero por el que vas dividiendo

Esto seria la funcion:
esperfecto(numero); donde numero es un parametro de entrada. ( El que mete el operador)
suma:=0;
n:=1;
MientrasQue (n<= numero) hacer
Si esdivisiblepor(numero,n ) entonces
suma:=suma+n;
n:= n +1;
finSi;
Fin mq
devuelve ( suma=numero )

luego tb tienes que hacer la funcion: esdivisiblepor(numero,n) que seria:

funcion esdivisiblepor ( numero : E , n: E ) devuelve boolean

principio
devuelve (( numero mod n ) = 0 )
fin esdivisiblepor;

y el general:

principio
escribirCadena(pantalla, " Escriba el numero entero positivo ");
leerEntero(numero);
Si esperfecto(numero) entonces
EscribirCadena(pantalla, " Su numero es perfecto ");
finSi;
fin;

Bueno ,dependiendo de lo que quieras poner en al final claro :\

Espero que te sirva

LOc0

Que en sus grandes ratos libres se sacó tb la formulita de turno:

2n-1 * (2n -1) (Siempre que 2n -1 sea primo)

Ejemplo:

Para n=1:
2n -1 = 21 -1 = 1 (No es primo, así que pasamos a n=2)

Para n=2:
22 -1 = 22 -1 = 3 (¡¡PRIMO!!)
Aplicamos la formulita--> 22-1(22 -1) = 23 = 6 (primer número perfecto)

Para n=3, 4, etc...

Resumiendo, que con comprobar que 2n -1 es primo y en caso afirmativo aplicar la fórmula lo tienes.

Salu2 y suerte!

PD: Esa fórmula vale para los números perfectos PARES (pero resulta que todavía no se han encontrado impares, y se sospecha que no existen... )

PD2:


#include <stdio.h>
#include <math.h>

#define NMAX 31

int primo(int num);

void main()
{
int n;
printf("\n BUSCADOR DE NUMEROS PERFECTOS marca MIKASA");
printf("\n*******************************************************************************\n\n");


n=1;
while(n<NMAX)
    {
    
            if(primo((int)pow(2, n)-1))
                printf("\n\t\tPara n=%d --> %.f", n, pow(2, n-1)*(pow(2, n)-1) );
            else
                printf("\n\t\tPara n=%d --> -------", n);
           
       n++;
       
    }
    printf("\n\n\t\t\tPulsa una tecla para salir...");
    getch();

}

int primo(int num)
{
int divisor=2, tope=sqrt(num);
int esprimo;


if(num>1)
   esprimo=1;
else
   esprimo=0;


while( divisor <= tope && esprimo)
{
  if( num % divisor == 0 )
       esprimo=0;
  else
       divisor++;
  }
  
  return esprimo;

}

[/i]

Usuarios habituales