Test Foro de elhacker.net SMF 2.1

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:

#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.
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:
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
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.
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:

#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);
                                                              }
                                                }
                             }
            }