Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ERIK546 en 29 Junio 2012, 18:18 pm



Título: Programa en C que imprime los primeros m números perfectos
Publicado por: ERIK546 en 29 Junio 2012, 18:18 pm
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:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int suma(int n);
  4. int main(int argc, char *argv[])
  5. {
  6.    int n;
  7.  
  8.    printf("Programa que devuelve la suma de todos los divisores de un numero n, sin incluirlo\n");
  9.    printf("Introduce el numero\n");
  10.    scanf("%d",&n);
  11.    printf("El resuldado es: %d\n",suma(n));
  12.  
  13.    system("PAUSE");
  14.    return 0;
  15. }  
  16.   int suma(int n){
  17.       int i;
  18.       int d;
  19.       int c;
  20.       c=0;
  21.       for(i=1;i<n;i++){
  22.                        if(n%i==0){
  23.                                   d=i;
  24.                                   c+=d;
  25.                                   }
  26.                        }
  27.                        return c;
  28.       }
  29.  
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:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int suma(int n);
  4. void perfectos(int m);
  5. int main(int argc, char *argv[])
  6. {
  7.    int n;
  8.    int m;
  9.    printf("Programa que devuelve la suma de todos los divisores de un numero n, sin incluirlo\n");
  10.    printf("Introduce el numero\n");
  11.    scanf("%d",&n);
  12.    printf("El resuldado es: %d\n",suma(n));
  13.    printf("Programa que imprime los primeros m numeros perfectos\n");
  14.    printf("Introduce m\n");
  15.    scanf("%d\n",&m);
  16.    printf("Los numeros perfectos son:\n");
  17.    perfectos(m);
  18.  
  19.  
  20.  
  21.    system("PAUSE");
  22.    return 0;
  23. }  
  24.   int suma(int n){
  25.       int i;
  26.       int d;
  27.       int c;
  28.       c=0;
  29.       for(i=1;i<n;i++){
  30.                        if(n%i==0){
  31.                                   d=i;
  32.                                   c+=d;
  33.                                   }
  34.                        }
  35.                        return c;
  36.       }
  37.       void perfectos(int m){
  38.           int i;
  39.           for(i=0;i<=m;i++){
  40.                             if(suma(i)==i){
  41.                                            printf("%d\n",i);              
  42.                                            }
  43.                             }
  44.           }
  45.  
Gracias a todos de antemano.


Título: Re: Programa en C que imprime los primeros m números perfectos
Publicado por: durasno en 29 Junio 2012, 19:24 pm
Hola! el programa anda bien, el problema es esto:
Código
  1. 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


Título: Re: Programa en C que imprime los primeros m números perfectos
Publicado por: ERIK546 en 29 Junio 2012, 20:45 pm
Hola! el programa anda bien, el problema es esto:
Código
  1. 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.


Título: Re: Programa en C que imprime los primeros m números perfectos
Publicado por: ERIK546 en 29 Junio 2012, 21:36 pm
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:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int suma(int n);
  4. void perfectos(int m);
  5. void amigos(int l);
  6. int main(int argc, char *argv[])
  7. {
  8.    int l;
  9.    int n;
  10.    int m;
  11.    printf("Programa que devuelve la suma de todos los divisores de un numero n, sin incluirlo\n");
  12.    printf("Introduce el numero\n");
  13.    scanf("%d",&n);
  14.    printf("El resuldado es: %d\n",suma(n));
  15.    printf("Programa que imprime los primeros m numeros perfectos\n");
  16.    printf("Introduce m\n");
  17.    scanf("%d",&m);
  18.    printf("Los numeros perfectos son:\n");
  19.    perfectos(m);
  20.    printf("Programa que imprime los primeros pares l de numeros amigos\n");
  21.    printf("Introduce l\n");
  22.    scanf("%d",&l);
  23.    printf("Los pares de numeros amigos son:\n");
  24.    amigos(l);
  25.  
  26.  
  27.  
  28.    system("PAUSE");
  29.    return 0;
  30. }  
  31.   int suma(int n){
  32.       int i;
  33.       int d;
  34.       int c;
  35.       c=0;
  36.       for(i=1;i<n;i++){
  37.                        if(n%i==0){
  38.                                   d=i;
  39.                                   c+=d;
  40.                                   }
  41.                        }
  42.                        return c;
  43.       }
  44.       void perfectos(int m){
  45.           int i;
  46.           for(i=1;i<=m;i++){
  47.                             if(suma(i)==i){
  48.                                            printf("%d\n",i);              
  49.                                            }
  50.                             }
  51.           }
  52.       void amigos(int l){
  53.            int i;
  54.            int j;
  55.            for(i=1;i<l;i++){
  56.                             for(j=i+1;j<l;j++){
  57.                                                if(i==suma(j) && j==suma(i)){
  58.                                                              printf("%d-%d\n",i,j);
  59.                                                              }
  60.                                                }
  61.                             }
  62.            }
  63.