Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: palacio29 en 24 Julio 2016, 19:12 pm



Título: (Consulta)Ejercicio de numeros amigos en C - Ayuda!
Publicado por: palacio29 en 24 Julio 2016, 19:12 pm
Hola

Tengo el siguiente ejercicio

Realizar una función que reciba como parámetro un arreglo de enteros positivos (cuyo tamaño se desconoce, termina en 0). La función debe retornar la cantidad de parejas de “números amigos” presentes en el arreglo. Dos números amigos son dos números enteros positivos a y b tales que a sea la suma de los divisores propios de b, y b sea la suma de los divisores propios de a. (Divisores propios son todos los divisores menos el propio numero).  Un ejemplo es el par de naturales (220, 284), ya que:
los divisores propios de 220 son 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 y 110, que suman 284;
los divisores propios de 284 son 1, 2, 4, 71 y 142, que suman 220.

Ej: Para el arreglo a={7,56,1184,2,6232,220,33,11,6368,1210,100,284,0}
la función deberá retornar 3 ya que estan presentes las parejas de amigos
(1184, 1210), (6232, 6368) y (220, 284),.

No debo usar arreglos auxiliares.
Hasta ahora hice lo siguiente:


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 9001
  4. void carga(int arreglo[N]);
  5. void contador(int arreglo[N]);
  6. int suma(int numero);
  7. int suma2(int numero2);
  8. int main()
  9. {
  10. int arreglo[N];
  11. printf ("Ingrese arreglo:\n");
  12. carga(arreglo);
  13. contador(arreglo);
  14.  
  15.  
  16.  
  17.    return 0;
  18. }
  19.  
  20. void carga(int arreglo[N])
  21. {
  22.    int numerin=-1,i=0;
  23.  
  24.    do
  25.    {
  26.        scanf ("%d",&numerin);
  27.  
  28.            if (numerin!=0)
  29.            {
  30.                if (numerin>0)
  31.                {
  32.                    arreglo[i]=numerin;
  33.                    i++;
  34.  
  35.                }
  36.            }
  37.  
  38.    }
  39.    while (numerin!=0 && i<N);
  40.  
  41. arreglo[i]=0;
  42. }
  43.  
  44. void contador(int arreglo[N])
  45. {
  46.    int numerin,i=0,j=0,numero=0,sumatoria=0,contador=0,numero2=0,sumatoria2=0;
  47.  
  48.    for (i=0;arreglo[i]!=0;i++)
  49.    {
  50.        numero2=arreglo[i];    ///GUARDO EL NUMERO
  51.        sumatoria2=suma(numero2); ///HAGO LA SUMATORIA DE DIVISORES DE ESE NUMERO
  52.  
  53.        for (j=1;arreglo[j]!=0;j++)
  54.        {
  55.            numero=arreglo[j];  ///GUARDO ESTE NUEVO NUMERO
  56.            sumatoria=suma2(numero);   ///HAGO LA SUMATORIA DE DIVISORES DE ESE NUMERO
  57.            if (numero2==sumatoria && numero==sumatoria2)
  58.            {
  59.                contador++;
  60.            }
  61.        }
  62.    }
  63.  
  64.  
  65.    printf ("\n%d",contador);
  66.  
  67. }
  68. int suma(int numero2)
  69. {
  70.    int div=1,sumita=0;
  71.    for (div=1;div<numero2;div++)
  72.    {
  73.        if (numero2%div==0)
  74.        {
  75.            sumita=sumita+div;
  76.        }
  77.  
  78.  
  79.  
  80.  
  81.  
  82.    }
  83.    return sumita;
  84. }
  85. int suma2(int numero)
  86. {
  87.    int div=1,sumita=0;
  88.  
  89.    for (div=1;div<numero;div++)
  90.    {
  91.        if (numero%div==0)
  92.        {
  93.            sumita=sumita+div;
  94.        }
  95.  
  96.  
  97.    }
  98.    return sumita;
  99. }
  100.  

Lo que hice fue cargar el arreglo, luego usar un for dentro de un for. En el primer for guarde el numero y realice la sumatoria de divisores del numero, dentro del otro for hice lo mismo y luego hice un if para comparar ambos  y si son iguales, suma en el contador

El problema es que el resultado siempre me da el doble de lo que me tendria que dar y nose donde esta el error. He probado el codigo de la sumatoria de divisores por separado es correcto.
Asi que probablemente el error este en los 2 for pero nose cual es. Si me pueden ayudar se los agradezco


Título: Re: (Consulta)Ejercicio de numeros amigos en C - Ayuda!
Publicado por: palacio29 en 24 Julio 2016, 19:23 pm
Hola

Tengo el siguiente ejercicio

Realizar una función que reciba como parámetro un arreglo de enteros positivos (cuyo tamaño se desconoce, termina en 0). La función debe retornar la cantidad de parejas de “números amigos” presentes en el arreglo. Dos números amigos son dos números enteros positivos a y b tales que a sea la suma de los divisores propios de b, y b sea la suma de los divisores propios de a. (Divisores propios son todos los divisores menos el propio numero).  Un ejemplo es el par de naturales (220, 284), ya que:
los divisores propios de 220 son 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 y 110, que suman 284;
los divisores propios de 284 son 1, 2, 4, 71 y 142, que suman 220.

Ej: Para el arreglo a={7,56,1184,2,6232,220,33,11,6368,1210,100,284,0}
la función deberá retornar 3 ya que estan presentes las parejas de amigos
(1184, 1210), (6232, 6368) y (220, 284),.

No debo usar arreglos auxiliares.
Hasta ahora hice lo siguiente:


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 9001
  4. void carga(int arreglo[N]);
  5. void contador(int arreglo[N]);
  6. int suma(int numero);
  7. int suma2(int numero2);
  8. int main()
  9. {
  10. int arreglo[N];
  11. printf ("Ingrese arreglo:\n");
  12. carga(arreglo);
  13. contador(arreglo);
  14.  
  15.  
  16.  
  17.    return 0;
  18. }
  19.  
  20. void carga(int arreglo[N])
  21. {
  22.    int numerin=-1,i=0;
  23.  
  24.    do
  25.    {
  26.        scanf ("%d",&numerin);
  27.  
  28.            if (numerin!=0)
  29.            {
  30.                if (numerin>0)
  31.                {
  32.                    arreglo[i]=numerin;
  33.                    i++;
  34.  
  35.                }
  36.            }
  37.  
  38.    }
  39.    while (numerin!=0 && i<N);
  40.  
  41. arreglo[i]=0;
  42. }
  43.  
  44. void contador(int arreglo[N])
  45. {
  46.    int numerin,i=0,j=0,numero=0,sumatoria=0,contador=0,numero2=0,sumatoria2=0;
  47.  
  48.    for (i=0;arreglo[i]!=0;i++)
  49.    {
  50.        numero2=arreglo[i];    ///GUARDO EL NUMERO
  51.        sumatoria2=suma(numero2); ///HAGO LA SUMATORIA DE DIVISORES DE ESE NUMERO
  52.  
  53.        for (j=1;arreglo[j]!=0;j++)
  54.        {
  55.            numero=arreglo[j];  ///GUARDO ESTE NUEVO NUMERO
  56.            sumatoria=suma2(numero);   ///HAGO LA SUMATORIA DE DIVISORES DE ESE NUMERO
  57.            if (numero2==sumatoria && numero==sumatoria2)
  58.            {
  59.                contador++;
  60.            }
  61.        }
  62.    }
  63.  
  64.  
  65.    printf ("\n%d",contador);
  66.  
  67. }
  68. int suma(int numero2)
  69. {
  70.    int div=1,sumita=0;
  71.    for (div=1;div<numero2;div++)
  72.    {
  73.        if (numero2%div==0)
  74.        {
  75.            sumita=sumita+div;
  76.        }
  77.  
  78.  
  79.  
  80.  
  81.  
  82.    }
  83.    return sumita;
  84. }
  85. int suma2(int numero)
  86. {
  87.    int div=1,sumita=0;
  88.  
  89.    for (div=1;div<numero;div++)
  90.    {
  91.        if (numero%div==0)
  92.        {
  93.            sumita=sumita+div;
  94.        }
  95.  
  96.  
  97.    }
  98.    return sumita;
  99. }
  100.  

Lo que hice fue cargar el arreglo, luego usar un for dentro de un for. En el primer for guarde el numero y realice la sumatoria de divisores del numero, dentro del otro for hice lo mismo y luego hice un if para comparar ambos  y si son iguales, suma en el contador

El problema es que el resultado siempre me da el doble de lo que me tendria que dar y nose donde esta el error. He probado el codigo de la sumatoria de divisores por separado es correcto.
Asi que probablemente el error este en los 2 for pero nose cual es. Si me pueden ayudar se los agradezco

Hola, disculpas, ya lo solucione. El problema es que se repetian los valores en el for.

Si tengo 1,2,3,4,5,6,7,8,9,10.

Y supongamos el 1 y el 4 son parejas...cuando en el for llegue al 4, al analizar el arreglo, me va a tomar el 1 tmb por eso cuenta 2 veces, por eso en el for no tengo que analizar toodo el arreglo sino desde donde se quedo.