You are on page 1of 5

Mejor respuesta - elegida por los votantes

// MCD Proceso MCD Escribir 'Ingrese el primer numero: '; Leer n1; Escribir 'Ingrese el segundo numero: '; Leer n2; Mientras (n1<>n2) Hacer Si n1>n2 Entonces n1<-n1-n2; Sino n2<-n2-n1; FinSi FinMientras Escribir 'El maximo comun divisor es: ',n1; FinProceso //MCM Proceso MCM Escribir 'Ingrese el primer numero: '; Leer a; Escribir 'Ingrese el segundo numero: '; Leer b; n1<-a; n2<-b; Mientras (n1<>n2) Hacer Si n1>n2 Entonces n1<-n1-n2; Sino n2<-n2-n1; FinSi FinMientras c<-a*b/n1; Escribir 'El minimo comun multiplo es: ',c; FinProceso Fuente(s): yo

Debe registrarse para ver este enlace. Gracias por su visita. Debe registrarse para ver este enlace. Gracias por su visita. Debe registrarse para ver este enlace. Gracias por su visita. Debe registrarse para ver este enlace. Gracias por su visita.

masterman Visitante

Mensajes: 2 Registrado: 19 Sep 2009, 17:47 Ciclo Formativo: ASI / ASIR Curso: 1

buscar

Algoritmo para calcular el mximo comn divisor de dos nmeros

Creo que todos, haciendo algo de memoria, recordaremos lo que nos ensearon en el colegio para calcular el mximo comn divisor de dos nmeros; se trata de, dados dos nmeros, obtener el mximo nmero que divida a ambos. Para ello, lo primero que haba que hacer era descomponer cada nmero en factores primos. Por ejemplo, para calcular el mcd (mximo comn divisor) de 756 y 1617: 756 = 7 * 3^3 * 2^2 1617 = 11 * 7^2 * 3 A continuacin tomamos los factores comunes elevemos al menos exponente y ese es el mcd; en nuestro ejemplo: mcd(756,1617) = 7 * 3 = 21 Hacer esto es relativamente sencillo, ahora bien, programarlo ya es otra cosa bien distinta. Lo ms complicado sera implementar una funcin que descomponga un nmero en sus factores primos. Se podra hacer, si bien existe un mtodo bastante ms sencillo: utilizando el algoritmo de Euclides. En qu consiste? De forma resumida, el pseudocdigo para la funcin que calcula el mcd quedara: function mcd(a, b) { if (a > b) { return mcd(a-b, b); } else if (b > a) { return mcd(a, b-a); } else { // a == b return a; } } Aplicndolo a nuestro ejemplo: mcd(756,1617) = mcd(756,861) = mcd(756,105) = mcd(651,105) = mcd(546,105) = mcd(441,105) = mcd(336,105) = mcd(231,105) = mcd(126,105) = mcd(21,105) = mcd(21,84) = mcd(21,63) = mcd(21,42) = mcd(21,21) = 21 Por supuesto, este algoritmo es susceptible de ciertas mejoras. Por ejemplo, multiplicar y dividir por 2 es algo sencillo utilizando las operaciones de bits: al desplazar un bit a la izquierda estamos multiplicando por 2 y al desplazarlo a la derecha estamos dividiendo por 2. De esta forma, podramos ahorrarnos algunos pasos en el ejemplo anterior: function mcd_mejorado(x, y) { var mayor = max(x,y); var menor = min(x,y); if (mayor > (menor << 1)) { return mcd_mejorado(mayor - (menor << 1), menor); } else { return mcd(mayor,menor); //llamada a la funcion anterior

} } Volviendo a nuestro ejemplo: mcd_mejorado(1617,756) = mcd_mejorado(756,105) = mcd_mejorado(546,105) = mcd_mejorado(336,105) = mcd_mejorado(126,105) = mcd(21,105) = mcd(21,84) = mcd(21,63) = mcd(21,42) = mcd(21,21) = 21 Visto as, podra parecer ms engorroso utilizar el algoritmo de Euclides con las mejoras comentadas frente al mtodo "tradicional" de descomponer en factores primos, pero cuando los nmeros son grandes (del orden de ms de 100 dgitos) y/o el nmero de operaciones a realizar crece (ms de 100.000 clculos del mcd), la mejora es sustancial.
Escrito por desperando el 29/07/2010 14:08 | Comentarios (1)

Comentarios
Ojo, el mtodo no se aplica a nmeros negativos. Adems, si no queris usar recursividad, tambin podis hacerlo as; function mcd( a, b ) { while(a!=b) { a=(a>b)?(a-b):a; b=(b>a)?(b-a):b; } return a; }
Escrito por Victor 21/03/2012 18:13

Aadir un Comentario:
Tu Nombre:

Tu Email:

Comentario:

Inserta aqu el cdigo de verificacin que ves en la imagen.

Enviar comentario

You might also like