Ej 4

Ej 4

de Luciano Umpierrez Garcia -
Número de respuestas: 2

Buenas, en el ejercicio 4 cree este código pero no me suena a que sea correcto. ¿Me darían una ayuda en como corregirlo?.

int ComunDivisor(int a,int b){

  int mcd = 1;

  if((a==b) || (a==1) || (b==1)){

    return mcd;

  }else

    if(a<b){

      if((b%a)==0){

        mcd = a;

      }else{

        ComunDivisor(b,a-1);

      }

    }else{

      if((a%b)==0){

        mcd = b;

      }else{

        ComunDivisor(a,b-1);

      }

    }

    return mcd;

}

En respuesta a Luciano Umpierrez Garcia

Re: Ej 4

de Nicolas Brignoni Dardano -
Luciano, o estoy seguro pero creo que el MCD de dos numero iguales es el mismo numero y en tu caso asignas 1. Igual no estoy seguro, no te fíes de mi palabra.
También podes usar una precondición de que el primer parámetro invocado a la función es mayor o a lo sumo igual al segundo [a>=b]
No se si esto es correcto pero te soluciona tener que ver cual es mayor que cual.

Otra cosa si invocas a la función con por ejemplo 10 y 3 el algoritmo no funciona pero no estoy seguro, lo estoy pensando en el aire.

Saludos
En respuesta a Luciano Umpierrez Garcia

Re: Ej 4

de Fernando Fernandez -
Hola
Está bien la idea de pasar de la instancia (a,b) a una más chica (a, b-1). Pero están los problemas matemáticos que señala Nicolás. No se cumple que mcd(a,b) = mcd(a,b-1).

Sea m = mcd(a,b), o sea, existen a' y b' tal que a = m a' y b = m b'.
Supongamos sin pérdida de generalidad que a > b y sea r = a % b, o sea existe q tal que a = q b + r, con 0<= r < b.
Entonces r = a - q b = (a' - q b') m. Por lo tanto m es también factor común de b y de r. Y se puede demostrar que es el máximo de los factores comunes.
De aquí se puede obtener una instancia más chica. Y hay que manejar bien el caso base.