Calcular mcd. Compila bien pero no corre

Iniciado por jairogon, 1 Julio 2010, 03:52 AM

0 Miembros y 2 Visitantes están viendo este tema.

jairogon

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;

}

cbug

Preferiría que utilices un system call antes que un getche de conio2.

Si compila bien, no queda otra que depurarlo.

nicolas_cof

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

jairogon

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

nicolas_cof

jairogon, de nada! Para eso estamos ;)

Salu10.

MIG80

#5
Tu programa original tambien funciona con unos pequeños ajustes:

Código (cpp) [Seleccionar]

//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;
}

nicolas_cof

#6
Cita de: czealt en  1 Julio 2010, 06:26 AM
Tu programa original tambien funciona con unos pequeños ajustes:

Código (cpp) [Seleccionar]

//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-while

Salu10.

MIG80

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

nicolas_cof

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.

MIG80

#9
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?