El siguiente programa compila bien pero no corre, la verdad no se por que?
Uso el DevC++.
//Programa que calcula el m.c.d de dos numeros
//enteros positivos.
#include<iostream>
#include<conio2.h>
using namespace std;
int main()
{
int a=0,b=0,mayor=0, menor=0,residuo=0,divisor=0,dividendo=0,resultado=0,mcd=0;
cout<<"Entra dos numeros enteros: ";
cin>>a>>b;
if(a>=b)
{
mayor=a;
menor=b;
}else
{
mayor=b;
menor=a;
}
dividendo=menor;
divisor=mayor;
do{
resultado=divisor/dividendo;
residuo=divisor%dividendo;
divisor=dividendo;
dividendo=residuo;
}while(dividendo==0||residuo==0);
mcd=dividendo;
if(mcd==1)
{
cout<<"Los numeros :"<<a<<" y"<<b<<" son primos entre si pues el mcd es 1";
} else
{
cout<<"El mcd de "<<a<<" y"<<b<<" es: "<<mcd;
}
getche();
return 0;
}
Preferiría que utilices un system call antes que un getche de conio2.
Si compila bien, no queda otra que depurarlo.
jairogon, te dejo esta funcion que seguro te sirve...
int mcd( int a, int b )
{
a = abs( a );
b = abs( b );
if ( b == 0 )
return a;
else
return mcd( b, a % b );
}
Nota: codigo corregido en base a lo planteado por do-while
Salu10.
Cita de: nicolas_cof en 1 Julio 2010, 04:53 AM
jairogon, te dejo esta funcion que seguro te sirve...
int mcd( int a, int b )
{
if ( b == 0 )
return a;
else
return mcd( b, a % b );
}
Salu10.
Gracias
Vaya que si me sirvio.
No sabia que el mcd se pudiera hallar recursivamente.
De nuevo mil Gracias
:D ;-)
jairogon, de nada! Para eso estamos ;)
Salu10.
Tu programa original tambien funciona con unos pequeños ajustes:
//Programa que calcula el m.c.d de dos numeros
//enteros positivos.
#include<iostream>
#include<conio2.h>
using namespace std;
int main()
{
int a,b,mayor, menor,residuo,divisor,dividendo,resultado,mcd;
cout<<"Entra dos numeros enteros: ";
cin>>a>>b;
if(a>=b)
{
mayor=a;
menor=b;
}else
{
mayor=b;
menor=a;
}
dividendo=mayor; // se llama "dividendo" al numero que sera dividido
divisor=menor; // se llama "divisor" al numero que divide
do{
resultado=dividendo/divisor;
residuo=dividendo%divisor;
dividendo=divisor;
divisor=residuo;
}while(divisor!=0);
mcd=dividendo;
if(mcd==1)
{
cout<<"Los numeros :"<<a<<" y "<<b<<" son primos entre si pues el mcd es 1";
} else
{
cout<<"El mcd de "<<a<<" y "<<b<<" es: "<<mcd;
}
getche();
return 0;
}
Cita de: czealt en 1 Julio 2010, 06:26 AM
Tu programa original tambien funciona con unos pequeños ajustes:
//Programa que calcula el m.c.d de dos numeros
//enteros positivos.
#include<iostream>
#include<conio2.h>
using namespace std;
int main()
{
int a,b,mayor, menor,residuo,divisor,dividendo,resultado,mcd;
cout<<"Entra dos numeros enteros: ";
cin>>a>>b;
if(a>=b)
{
mayor=a;
menor=b;
}else
{
mayor=b;
menor=a;
}
dividendo=mayor; // se llama "dividendo" al numero que sera dividido
divisor=menor; // se llama "divisor" al numero que divide
do{
resultado=dividendo/divisor;
residuo=dividendo%divisor;
dividendo=divisor;
divisor=residuo;
}while(divisor!=0);
mcd=dividendo;
if(mcd==1)
{
cout<<"Los numeros :"<<a<<" y "<<b<<" son primos entre si pues el mcd es 1";
} else
{
cout<<"El mcd de "<<a<<" y "<<b<<" es: "<<mcd;
}
getche();
return 0;
}
czealt, tu codigo tiene algunos errores, por ejemplo la division por 0 no es valida.
Esta linea no la utilizas
resultado = dividendo / divisor;Ademas como bien menciono
cbug, no es recomendable el uso de la libreria conio ya que no es estandar y esta obsoleta.
Aca dejo un codigo parecido al que venia haciendo
jairogon#include <iostream>
#include <cmath>
using namespace std;
int main( void )
{
int a, b, mayor, menor, residuo, divisor, dividendo, mcd;
cout << "Entra dos numeros enteros: ";
cin >> a >> b;
a = abs( a );
b = abs( b );
if ( a >= b )
{
mayor = a;
menor = b;
}
else
{
mayor = b;
menor = a;
}
dividendo = mayor;
divisor = menor;
while ( divisor != 0 )
{
residuo = dividendo % divisor;
dividendo = divisor;
divisor = residuo;
}
mcd = dividendo;
if ( mcd == 1 )
cout << "Los numeros " << a << " y " << b << " son primos entre si pues el m.c.d es 1" << endl;
else
cout << "El m.c.d de " << a << " y " << b << " es: " << mcd << endl;
return 0;
}
Nota: codigo corregido en base a lo planteado por
do-whileSalu10.
nicolas_cof, tienes razón en que la variable resultado no es necesaria. En lo del bucle (en tu version del programa)..., da lo mismo si es while o do..while. Como quitaste la linea resultado=dividendo/divisor; ya no existe la posibilidad de una división por 0.
Cita de: czealt en 1 Julio 2010, 19:31 PM
nicolas_cof, tienes razón en que la variable resultado no es necesaria. En lo del bucle (en tu version del programa)..., da lo mismo si es while o do..while. Como quitaste la linea resultado=dividendo/divisor; ya no existe la posibilidad de una división por 0.
czealt, si te fijas bien en el codigo no seria lo mismo hacer un while que un do-while ya que con este ultimo estarias ejecutando 3 sentencias totalmente innecesarias.
Salu10.
Citar
... si te fijas bien en el codigo no seria lo mismo hacer un while que un do-while ya que con este ultimo estarias ejecutando 3 sentencias totalmente innecesarias.
Bueno, eso solo sucederia cuando uno de los números dados como entrada es cero lo cual no es una entrada válida para el programa. Si se ha de verificar por la entrada válida, ¿porqué no tambien verificar por la entrada de números negativos?
Cita de: czealt en 1 Julio 2010, 21:28 PM
Citar
... si te fijas bien en el codigo no seria lo mismo hacer un while que un do-while ya que con este ultimo estarias ejecutando 3 sentencias totalmente innecesarias.
Bueno, eso solo sucederia cuando uno de los números dados como entrada es cero lo cual no es una entrada válida para el programa. Si se ha de verificar por la entrada válida, ¿porqué no tambien verificar por la entrada de números negativos?
czealt, porque pensas que se tendria que verificar por la entrada de numeros negativos?
CitarEl máximo común divisor (abreviado mcd o m.c.d.) de dos o más números enteros es el mayor número que los divide sin dejar resto. - Wikipedia
Que se ingrese como entrada el valor 0, no quiere decir que este sea una entrada invalida para el programa, ya que por definicion seria correcto. Yo lo que te queria decir con respecto del do-while es que ejecutarias 3 sentencias totalmente innecesarias que no aportan ningun valor al objetivo del programa. Por eso es mejor usar el while y evitar ejecutar ese bloque de codigo.
Salu10.
OK nicolas_cof si 0 es un valor válido como entrada para el programa que calcula el M.C.D de dos números dime cuanto es el MCD de 0 y 1?
Cita de: czealt en 2 Julio 2010, 00:00 AM
OK nicolas_cof si 0 es un valor válido como entrada para el programa que calcula el M.C.D de dos números dime cuanto es el MCD de 0 y 1?
1
Salu10.
Muy bien (señido a la definición, como debe de ser).
Saludos.
Cita de: czealt en 2 Julio 2010, 00:35 AM
Muy bien (señido a la definición, como debe de ser).
Saludos.
function mcd(a, b)
while b ≠ 0
t := b
b := a mod b
a := t
return a
Salu10.
¡Buenas!
Solo un apunte y no con intencion de faltar a nadie, simplemente con la de informar.
El mcd de dos enteros (d a partir de ahora) a y b, cumple que si c|a y c|b entonces d|c. En estas condiciones se encuentran dos numeros enteros, d y -d.
Para evitar confusiones y por la unicidad de los resultados, se llama mcd(a,b) a max{d,-d}, es decir, al que es positivo.
Otra propiedad del mcd es que mcd(a,b) = mcd (|a|,|b|), por lo que para obtener el mcd de dos enteros por medio del algoritmo de euclides, al trabajar con ordenadores, lo correcto seria trabajar con el valor absoluto de los datos introducidos, ya que de esta forma obtendremos directamente el valor positivo.
Otro apunte es que para calcular el mcd por medio del algoritmo de auclides, se utiliza la division euclidea que dice que dados dos enteros a y b, existen otros dos enteros, unicos, c y r cumpliendo que:
a = cb + r donde 0 <= r < |b|
Es decir, el resto es positivo, y esto es algo que en C/C++ no se cumple al calcular modulos, ya que si el dividendo y el divisor tienen signos opuestos a%b dara como resultado un entero negativo.
¡Saludos!
Cita de: do-while... lo correcto seria trabajar con el valor absoluto de los datos introducidos ...
Tenes razon
do-while, esto ultimo se me habia pasado por alto! Gracias ;)
Salu10.
¡De nada!
Todo el mundo tiene algun patinazo de vez en cuando, servidor incluido :silbar:, faltaria mas.
¡Saludos!
Podría ser esta una solución rápida, me basé en teoremas de congruencias:
#include <stdio.h>
int mcd(int a, int b)
{
if(b == 0)
return a;
else
mcd(a, a%b);
}
void _abs(int *a)
{
if(*a < 0) *a *= -1;
}
int main()
{
int x, y, mxdiv;
scanf("%d %d", &x, &y);
_abs(&x);
_abs(&y);
printf("\t %d \t %d", x, y);
mxdiv = mcd(x, y);
printf("\n MCD > %d \n", mxdiv);
return 0;
}
Lei que también el operador condicional ? sería un buen reemplazo para ese if de _asb.
cbug, fijate en esta parte...
int mcd( int a, int b )
{
if ( b == 0 )
return a;
else
mcd( b, a % b ); //mcd( a, a % b );
}
Yo usaria la funcion abs() dentro de la funcion mcd(), debido a lo que habia aclarado do-while, que a mi se me habia pasado por alto. Ya que haciendo esto uno se olvida de tener que aplicarle el valor absoluto a los numeros antes de pasarlos a la funcion mcd().
Otro punto que se podria ver, seria usar la funcion abs() de la libreria stdlib.h
#include <stdio.h>
#include <stdlib.h>
int mcd( int a, int b )
{
a = abs( a );
b = abs( b );
return ( b == 0 ) ? a : mcd( b, a % b );
}
int main( void )
{
int x, y;
scanf( "%d %d", &x, &y );
printf( "mcd: %d\n", mcd( x, y ) );
return 0;
}
Salu10.
¡Buenas!
Eso es nicolas_cof. Lo crrecto seria mcd(b,a%b); no mcd(a,a%b); ya que mcd{a,b} = mcd{b,r}, con r el resto de dividir a por b (es decir |a|%|b|).
mcd( b, a % b ); //mcd( a, a % b );
Eso fue una corrección? Creo que ya fue respondida por do-while. :xD
Ahora bien, lo de incluir stdlib.h para usar abs(), me parece mucho, no sé si en esto último estoy en lo correcto.
Cita de: cbug en 3 Julio 2010, 01:22 AM
mcd( b, a % b ); //mcd( a, a % b );
Eso fue una corrección? Creo que ya fue respondida por do-while. :xD
Si, fue una correcion, que ya fue afirmada por
do-while. ;)
Cita de: cbug en 3 Julio 2010, 01:22 AM
mcd( b, a % b ); //mcd( a, a % b );
Ahora bien, lo de incluir stdlib.h para usar abs(), me parece mucho, no sé si en esto último estoy en lo correcto.
cbug, al contrario ya que en la etapa de enlazado se extrae solamente la funcion utilizada de la libreria stdlib.h, en este caso abs().
Ademas si te pones a comparar entre el codigo generado en asm usando una funcion propia _abs() y la que viene en la libreria stdlib.h, la diferencia es bastante notable y favorable para la funcion abs() y por ende mucho mas eficiente.
Salu10.
:-[ Ups es cierto xD.
Ahora bien, gracias por el consejo sobre la librería... no sabía que en el enlazado sólo se extrae esa función.
cbug, de nada! Para eso estamos compañero ;)
Salu10.