Programa en c "Máximo común divisor de dos números"

Iniciado por rayk, 17 Junio 2011, 13:41 PM

0 Miembros y 1 Visitante están viendo este tema.

rayk

Hola me habia propuesto elaborar un programa que pudiese sacar el máximo común divisor de dos números. De momento lo estoy haciendo para que el primer numero que se introduzca sea mayor que el segundo(supongo que luego con un if pondre las dos opciones).Para ello he utilizado el conocido algoritmo de Euclides. Pero hay algo en el codigo que debo de hacer mal ya que no consigo que funcione.
incluyo el codigo para que me echeis una mano.

Saludos y gracias

#include <stdio.h>
#include <stdlib.h>
//Máximo común divisor de dos números mediante el algoritmo de Euclides.
int main()
{
    int a, b, c, r;
    printf("Maximo comun divisor de a y b\n\n");
    printf("a: ");
    scanf("%d", &a);
    printf("b: ");
    scanf("%d", &b);
    r=a%b;
    while(r>0)
    {
              fflush(stdin);
              a=b;
              b=r;
              r=a%b;
    }
    sprintf("el maximo comun divisor es %d", b);
    system("pause");
}

Dark Invader

#1
Mirando por encima el codigo:

CitarPD:Te pego lo que necesitas de que el primero sea mayor que el segundo.

#include <stdio.h>
//Máximo común divisor de dos números mediante el algoritmo de Euclides.
int main()
{
    int a, b, c, r;
    printf("Maximo comun divisor de a y b\n\n");
    printf("a: ");
    scanf("%d", &a);
    printf("b: ");
    scanf("%d", &b);
    fflush(stdin);
    r=a%b;
    while(r>0)
    {
              if (a>b){
   
             
              a=b;
              b=r;
              r=a%b;
              }else{
                   printf(" el primer numero debe ser mayor");
                   return -1;
                   }
                   
    }
    printf("el maximo comun divisor es %d", b);
    getchar();
    return 0;
}


Te fallaba el printf del final.

Este da perfecto.

Salu2

rayk

Muchas gracias, lo empece ayer y al final lo deje por que no encontraba el fallo.

una duda mas: poner system("pause"); equivale a lo que pusiste tu

getch();
return 0;

he visto que de esta forma te ahorras el <stdlib.h>

Saludos y gracias

Dark Invader

Si,getchar() espera a que se pulse la tecla enter para finalizar,y return 0 indica al programa que todo fue bien.

Mira de nuevo mi codigo ya que edite y puse nuevas funciones que pedias.

Salu2

rayk

#4
Vale, y ¿el return -1? que funcion tiene, supongo que retroceder no, de modo que introduzcas las dos variables de nuevo.

otra cosa, ¿ es imprescindible poner el return 0; al final?

saludos

Editado: Me he dado cuenta de que no es necesario poner la condición de que el primero sea mayor que el segundo. Y esque de no ser asi tras haber entrado en el while los numeros se cambian entre si de manera que la segunda vez que entra en el while es como si los hubiesemos introducido en el orden correcto. No se si me he explicado bien.




Dark Invader

Un valor distinto a 0 en el return indica al sistema operativo que hay un fallo y cierra el programa...Como ves es muy útil para no andarse por las ramas,indicas el fallo y se cierra...

¿Es imprescindible?Pues no  :xD Pero es una buena costumbre,yo lo añado en todos mis programas,pero se puede prescindir,a mi me gusta ponerlo siempre.

Cita de: rayk en 17 Junio 2011, 14:24 PM
Editado: Me he dado cuenta de que no es necesario poner la condición de que el primero sea mayor que el segundo. Y esque de no ser asi tras haber entrado en el while los numeros se cambian entre si de manera que la segunda vez que entra en el while es como si los hubiesemos introducido en el orden correcto. No se si me he explicado bien.


No me entere bien de lo que me has dicho  :xD

Salu2

rayk

A ver si me explico mejor...

Con respecto al problema de que a tuviese que ser a mayor que b, realmente es indiferente. Voy a ponerte un ejemplo a ver si me explico mejor.

Supongamos que a=6 y b=4, entonces el ordenador hace el modulo a%b (6%4) y le da r=2, entonces como r es mayor que 0 entra en el while. Ahora a=b y b=r, entonces vuelve a hacer el modulo a%b (en este caso 4&2) le da un  r=0 por lo que no vuelve a entrar en el while y da el valor b como mcd en este caso 2.

Ahora bien si en vez de introducirlos en ese orden, los cambiamos a=4 y b=6 , el ordenadorhace el modulo de a%b (4%6) lo que le da un r=4, por tanto entra dentro del while. Ahora a=b y b=r, entonces vuelve a hacer el modulo a%b (en este caso 6&4) que resulta ser la situcion inicial de cuando los metes en orden.

Es decir que es indiferente meter primero el mayo y luego el menor o al contrario.
espero que haya quedado claro ajaja.

Dark Invader

Mmm,

Creo que lo piye,no me presiones mucho que acabo de salir de un examen de fisica  :xD jaja

Si bueno entonces no habría problema,no me había fijado en la condición y ya había preparado otro algoritmo para ver como sería a la inversa pero me olvide del while y solo estaba pendiente a la factorización...

Salu2

absgab

  Tengo otra versión, donde podes operar con dos variables no impotando el orden en que la ingresaste, sea mayor la primera o no. Es muy sencillo.
esta seria la funcion del proyect.


void MCD(int n1, int  n2)
{
if(n1>n2)
{
    int r=n1%n2;

while(r>0)
   {

           fflush(stdin);
           n1 = n2;
           n2 = r;
           r=n1%n2;

   }
   printf("mcd:%d",n2);
}


if(n1<n2)
{

   int r=n2%n1;

    while(r>0)
   {

        fflush(stdin);
        n2 = n1;
        n1 = r;
        r=n2%n1;

    }

    printf("mcd:%d",n1);
}

}