elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  (Consulta)Ejercicio de numeros amigos en C - Ayuda!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: (Consulta)Ejercicio de numeros amigos en C - Ayuda!  (Leído 1,219 veces)
palacio29

Desconectado Desconectado

Mensajes: 103


Ver Perfil
(Consulta)Ejercicio de numeros amigos en C - Ayuda!
« 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


« Última modificación: 24 Julio 2016, 19:14 pm por palacio29 » En línea

palacio29

Desconectado Desconectado

Mensajes: 103


Ver Perfil
Re: (Consulta)Ejercicio de numeros amigos en C - Ayuda!
« Respuesta #1 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.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
PHOTOSHOP HACE PAGINAS WEB?? CONSULTA PORFAVOR RESPONDAN AMIGOS.. « 1 2 »
Diseño Gráfico
ositocaro 13 3,226 Último mensaje 21 Noviembre 2005, 03:09 am
por + enrique ZP
Programa para hallar números amigos « 1 2 »
Programación General
Charderak 14 18,886 Último mensaje 27 Junio 2010, 19:26 pm
por Charderak
Hallar numeros amigos
Scripting
franncc22 3 5,466 Último mensaje 7 Mayo 2011, 20:04 pm
por .:UND3R:.
Ayuda progrma numeros amigos
Programación C/C++
skatres 8 3,063 Último mensaje 26 Noviembre 2011, 18:04 pm
por skatres
Numeros amigos y numeros perfectos programa en C
Programación C/C++
estudiante_1 2 3,116 Último mensaje 11 Agosto 2015, 23:51 pm
por estudiante_1
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines