Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema numeros amigos

Estas en el tema de Problema numeros amigos en el foro de C/C++ en Foros del Web. Buenas el problema me pide que dado un intervalo me diga los numeros amigos que hay en ese intervalo. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original ...
  #1 (permalink)  
Antiguo 22/11/2011, 10:20
Avatar de juanalbertosk8  
Fecha de Ingreso: noviembre-2011
Ubicación: Málaga, Spain, Spain
Mensajes: 10
Antigüedad: 12 años, 5 meses
Puntos: 0
Problema numeros amigos

Buenas el problema me pide que dado un intervalo me diga los numeros amigos que hay en ese intervalo.


Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int divisor(int a){
  5. int x=1, y=0, r;
  6.     for(int cont=1;cont<a;cont++){
  7.         if(a%x == 0 and x!=a){
  8.             r=a%x;
  9.             x++;
  10.         }
  11.         else{
  12.             y=y+r;
  13.             x++;
  14.         }
  15.     }
  16.     return y;
  17.  
  18. }
  19. int divisor1(int b){
  20.     int w=1, z=0, t;
  21.     for(int cont=1; cont<b; cont++){
  22.         if(b%w == 0 and w!=b){
  23.             t=b%w;
  24.             w++;
  25.         }
  26.         else{
  27.             z=z+t;
  28.             w++;
  29.         }
  30. }
  31. return z;
  32. }
  33.  
  34. int main() {
  35.     int n, m, a, b;
  36.     cout<<"Introduce un intervalo dando dos numeros: ";
  37.     cin>>n>>m;
  38.     a=n;
  39.     b=n++;
  40.     for(int i=1;i<(m-n);i++){
  41.     if((divisor(a) == b) && (divisor1(b)==a)){
  42.         a++;
  43.     cout <<"El numero "<<a<<" es amigo del numero "<<b<<endl;
  44.     }
  45.         else{
  46.             a++;
  47.             b++;
  48.         }
  49.     }
  50.     return 0;
  51. }

Me podrian decir donde fallo o darme una posible solucion. Gracias
  #2 (permalink)  
Antiguo 22/11/2011, 12:20
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Problema numeros amigos

Para empezar no se porque tienes dos funciones totalmente iguales pero que le cambiaste el nombre...es incuerente eso...

Segundo yo cambie la funcion divisor, no se si la tuya estaba mal , pero esta esta funcionando:

Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int divisor(int a){
  5. int suma=0;
  6.     for(int i = 1;i<a;i++){
  7.         if (a % i == 0) suma += i;
  8.     }
  9.     return suma;
  10.  
  11. }
  12.  
  13. int main() {
  14.     int n, m, a, b;
  15.     cout<<"Introduce un intervalo dando dos numeros: ";
  16.     cin>>n>>m;
  17.    
  18.     if((divisor(n) == m) && (divisor(m)==n)){
  19.      
  20.         cout <<"El numero "<<n<<" es amigo del numero "<<m<<endl;
  21.     }
  22.        
  23.  
  24.     return 0;
  25. }

Falta que se fije en todo el bucle que lo saque solo para chequear, eso no deberia ser dificil...
  #3 (permalink)  
Antiguo 22/11/2011, 12:50
Avatar de juanalbertosk8  
Fecha de Ingreso: noviembre-2011
Ubicación: Málaga, Spain, Spain
Mensajes: 10
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Problema numeros amigos

En la linea 18 no seria
Código C++:
Ver original
  1. if((divisor(a) == m) && (divisor(b)==n)){
Y no tendria que asignar el valor de n a "a" y a b=n++?

Gracias
  #4 (permalink)  
Antiguo 22/11/2011, 12:57
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Problema numeros amigos

Porque dices eso? Porque insiste en asignarle uno mas a n??

El codigo que te pase se fija si dos numeros son amigos. Lo que deberias hacer es ahora recorrer todas las tuplas de numeros entre n u m y verificar el if que te di.
  #5 (permalink)  
Antiguo 22/11/2011, 13:17
Avatar de juanalbertosk8  
Fecha de Ingreso: noviembre-2011
Ubicación: Málaga, Spain, Spain
Mensajes: 10
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Problema numeros amigos

Si me lié un poco, el problema que tengo ahora es que si le doy un intervalo entre 100 y 284 el programa me termina sin imprimir nada por pantalla, en cambio si le doy un intervalo entre 200 y 284 si me encuentra los números amigos.

De que puede ser eso?
  #6 (permalink)  
Antiguo 22/11/2011, 13:27
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Problema numeros amigos

Como estas haciendo el ciclo??
  #7 (permalink)  
Antiguo 22/11/2011, 13:33
Avatar de juanalbertosk8  
Fecha de Ingreso: noviembre-2011
Ubicación: Málaga, Spain, Spain
Mensajes: 10
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Problema numeros amigos

Cita:
Iniciado por sam90 Ver Mensaje
Como estas haciendo el ciclo??
He hecho el bucle con un do while y aclarando que el programa parara cuando i < m-n.
Nose si estara bien, pero el programa me funciona para intervalos menores de 127 numeros.
  #8 (permalink)  
Antiguo 22/11/2011, 13:53
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Problema numeros amigos

Pon una sentencia como esta para que veas que numeros estas comparando:
cout << "probando " << a << " " << b << endl ;

Ademas tenes que chequer mas de m-n casos.
  #9 (permalink)  
Antiguo 22/11/2011, 14:07
Avatar de juanalbertosk8  
Fecha de Ingreso: noviembre-2011
Ubicación: Málaga, Spain, Spain
Mensajes: 10
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Problema numeros amigos

Lo que me pasa es que si le doy un valor n=20 y un valor 284. Me comprueba 21 con 284, 22 con 284 etc... pero si le doy un valor de 285 me comprueba con 285 y si lo disminuyo cada vez que me hace la funcion me aumenta la n y me disminuye m y asi nunca se encuentran.
Donde podria meter
Código C++:
Ver original
  1. if(m==n)
  2. {
  3. m--;
  4. }

Última edición por juanalbertosk8; 22/11/2011 a las 14:31
  #10 (permalink)  
Antiguo 22/11/2011, 14:36
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Problema numeros amigos

Tienes que usar dos iteradores:

Código C++:
Ver original
  1. for(i = n; i <= m, i++)
  2.     for(j=i+1; j <=m ; j++)
  3.         if((divisor(n) == m) && (divisor(m)==n))      
  4.              cout <<"El numero "<<n<<" es amigo del numero "<<m<<endl;

Asi recorres las duplas de elementos:
(n,n+1) (n,n + 2) ....(n,m)
(n+1,n+2) ...............(n+1,m)
.
.
.
(m,m)
  #11 (permalink)  
Antiguo 22/11/2011, 14:55
Avatar de juanalbertosk8  
Fecha de Ingreso: noviembre-2011
Ubicación: Málaga, Spain, Spain
Mensajes: 10
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Problema numeros amigos

No sale nada al meterle eso.

Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int divisor(int a){
  5. int suma=0;
  6. for(int i = 1;i<a;i++){
  7. if (a % i == 0) suma += i;
  8. }
  9. return suma;
  10.  
  11. }
  12.  
  13. int main() {
  14. int n, m, a;
  15. int i = 0;
  16.  
  17. do{
  18. cout<<"Introduce un intervao dando dos numeros: ";
  19. cin>>n>>m;
  20. }
  21. while(n>m);
  22.  
  23. do{
  24. if((divisor(n) == m) && (divisor(m)==n)){
  25. cout <<"El numero "<<n<<" es amigo del numero "<<m<<endl;
  26. }
  27. i++;
  28. n++;
  29. }
  30. while(i<m*n);
  31. return 0;
  32. }

Tengo asi el programa, me lo podria corregir alguien?

Última edición por juanalbertosk8; 22/11/2011 a las 15:28
  #12 (permalink)  
Antiguo 22/11/2011, 15:35
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Problema numeros amigos

Se me paso sin querer, no cambie los indices:

Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int divisor(int a){
  5.     int suma=0;
  6.     for(int i = 1;i<a;i++){
  7.         if (a % i == 0) suma += i;
  8.     }
  9.     return suma;
  10. }
  11.  
  12. int main() {
  13.     int n, m, a, b,i,j;
  14.     cout<<"Introduce un intervalo dando dos numeros: ";
  15.     cin>>n>>m;
  16.  
  17.  
  18.     for(i = n; i <= m; i++){
  19.         for(j=i+1; j <=m ; j++){
  20.             //if (i == 220 && j == 284) cout << "aaaaaaaaaaaaa";
  21.             if((divisor(i) == j) && (divisor(j)==i)) {    
  22.                  cout <<"El numero "<<i<<" es amigo del numero "<<j<<endl;
  23.              }
  24.         }
  25.     }
  26. }

Etiquetas: numeros
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:33.