Programa en C que imprime los primeros m números perfectos

Iniciado por ERIK546, 29 Junio 2012, 18:18 PM

0 Miembros y 1 Visitante están viendo este tema.

ERIK546

Hola a todos, necesito su ayuda de nuevo; esta vez es un programa que imprime los primeros "m" números perfectos. Un número perfecto es aquél número "n" en el cual la suma de sus divisores (sin incluir a "n") es igual a ése número "n". Por ejemplo el 6; sus divisores sin incluirlo serían: 3, 2, 1 y su suma es igual a 6. En un mensaje anterior solicite su ayuda para realizar una función que me diera dicha suma de cualquier número, les dejo el código que lo hace:

#include <stdio.h>
#include <stdlib.h>
int suma(int n);
int main(int argc, char *argv[])
{
    int n;

    printf("Programa que devuelve la suma de todos los divisores de un numero n, sin incluirlo\n");
    printf("Introduce el numero\n");
    scanf("%d",&n);
    printf("El resuldado es: %d\n",suma(n));

    system("PAUSE");
    return 0;

   int suma(int n){
       int i;
       int d;
       int c;
       c=0;
       for(i=1;i<n;i++){
                        if(n%i==0){
                                   d=i;
                                   c+=d;
                                   }
                        }
                        return c;
       }

Ahora utilizando esta función necesito hacer un programa que me registre los primeros "m" números perfectos, como se imaginarán tendré que llamar a dicha función dentro de la nueva función. Lo que busca este programa es que si por ejemplo yo ingreso "m" con el valor de 30; me imprima sólo los números perfectos menores o iguales a 30, serían: 6, 28. He avanzado un poco y aunque compila y ejecuta correctamente, no me da ningún resultado como debiera. Les dejo lo que tengo hasta ahora:

#include <stdio.h>
#include <stdlib.h>
int suma(int n);
void perfectos(int m);
int main(int argc, char *argv[])
{
    int n;
    int m;
    printf("Programa que devuelve la suma de todos los divisores de un numero n, sin incluirlo\n");
    printf("Introduce el numero\n");
    scanf("%d",&n);
    printf("El resuldado es: %d\n",suma(n));
    printf("Programa que imprime los primeros m numeros perfectos\n");
    printf("Introduce m\n");
    scanf("%d\n",&m);
    printf("Los numeros perfectos son:\n");
    perfectos(m);
   
   
   
    system("PAUSE");
    return 0;

   int suma(int n){
       int i;
       int d;
       int c;
       c=0;
       for(i=1;i<n;i++){
                        if(n%i==0){
                                   d=i;
                                   c+=d;
                                   }
                        }
                        return c;
       }
       void perfectos(int m){
           int i;
           for(i=0;i<=m;i++){
                             if(suma(i)==i){
                                            printf("%d\n",i);             
                                            }
                             }
           }

Gracias a todos de antemano.

durasno

Hola! el programa anda bien, el problema es esto:
scanf("%d\n",&m);
el \n esta demas, es por eso q no te funciona... Y en el for de la funcion perfectos() inicializa i=1


Saludos
Ahorrate una pregunta, lee el man

ERIK546

#2
Cita de: durasno en 29 Junio 2012, 19:24 PM
Hola! el programa anda bien, el problema es esto:
scanf("%d\n",&m);
el \n esta demas, es por eso q no te funciona... Y en el for de la funcion perfectos() inicializa i=1


Saludos
Muchas gracias durasno, tienes toda la razón.

ERIK546

Les dejo el código que resultante, además le he incluido una función que calcula las primeras "l" parejas de números amigos. Gracias por todo:

#include <stdio.h>
#include <stdlib.h>
int suma(int n);
void perfectos(int m);
void amigos(int l);
int main(int argc, char *argv[])
{
    int l;
    int n;
    int m;
    printf("Programa que devuelve la suma de todos los divisores de un numero n, sin incluirlo\n");
    printf("Introduce el numero\n");
    scanf("%d",&n);
    printf("El resuldado es: %d\n",suma(n));
    printf("Programa que imprime los primeros m numeros perfectos\n");
    printf("Introduce m\n");
    scanf("%d",&m);
    printf("Los numeros perfectos son:\n");
    perfectos(m);
    printf("Programa que imprime los primeros pares l de numeros amigos\n");
    printf("Introduce l\n");
    scanf("%d",&l);
    printf("Los pares de numeros amigos son:\n");
    amigos(l);
   


    system("PAUSE");
    return 0;

   int suma(int n){
       int i;
       int d;
       int c;
       c=0;
       for(i=1;i<n;i++){
                        if(n%i==0){
                                   d=i;
                                   c+=d;
                                   }
                        }
                        return c;
       }
       void perfectos(int m){
           int i;
           for(i=1;i<=m;i++){
                             if(suma(i)==i){
                                            printf("%d\n",i);             
                                            }
                             }
           }
       void amigos(int l){
            int i;
            int j;
            for(i=1;i<l;i++){
                             for(j=i+1;j<l;j++){
                                                if(i==suma(j) && j==suma(i)){
                                                              printf("%d-%d\n",i,j);
                                                              }
                                                }
                             }
            }