martes, 1 de noviembre de 2016

Máximo común divisor de tres números

Deseamos calcular el máximo común divisor de 3 números. Para conseguirlo podemos aplicar la propiedad recursiva que nos dice que primero se ha de calcular el MCD de dos de ellos, y luego volvemos a calcular el MCD entre el valor anteriormente calculado y el tercer número.

Ejemplo

Deseamos calcular el MCD entre 120, 180 y 440.

Pasos a seguir:

  1. Primero calculamos el MCD entre 120 y 180. Y se obtiene que MCD(120, 180)=60
  2. Segundo calculamos el MCD entre 60 y 440. Y se obtine que MCD(60, 440)=20
Por tanto, el MCD de los tres números es: 
  • MCD(120, 180, 440) = 20


El código HTML es el siguiente.

 <!DOCTYPE html>   
  <html>   
  <head>   
   <meta charset="UTF-8">   
   <title>Máximo común divisor</title>    
  </head>   
  <body>  
   <h1>Máximo común divisor (MCD)</h1>  
   <h2>Dados dos o tres números calcular el MCD</h2>  
   <p>Por favor, introduzca los números. El tercer número es opcional.</p>  
   <p><input id="num1" value="150"></p>  
   <p><input id="num2" value="120"></p>  
   <p><input id="num3"><i> (opcional)</i></p>  
   <button type="button" onclick="myFunction()">Calcular</button>  
   <p id="calculo"></p>  
   <p id="calculo2"></p>  
         <p id="calculo3"></p>  
   <script type="text/javascript" src="mcdmcm2.js">   
   </script>  
   <p>Máximo Común Dividor (MCD) = comunes a la mínima potencia</p>  
   <p>mínimo común múltiplo (mcm) = comunes y no comunes a la máxima potencia</p>  
  </body>   
  </html>  

El código JS es el siguiente.

 var x,y,z,mcd,text,text2,text3,resulta;  
 function myFunction() {  
   x = parseFloat(document.getElementById("num1").value);  
   y = parseFloat(document.getElementById("num2").value);  
   z = parseFloat(document.getElementById("num3").value);  
   document.getElementById("calculo").style.color="#0A8A0A";  
   if (isNaN(x) || isNaN(y) || x%1!==0 || y%1!==0 || x<1 || y<1 ) {  
     text = "Es necesario introducir dos números válidos. El tercer valor es opcional.";  
     document.getElementById("calculo").style.color="#FF0000";  
                 var text2 = "";  
   } else {  
             factorizame(x);  
       text = resulta+"<br>";  
       factorizame(y);  
       text += resulta+'<br>';  
       if (!isNaN(z) && z%1==0 && z>=1){  
           factorizame(z);  
                 text += resulta+"<br>";  
       }  
             if (!isNaN(x) && !isNaN(y) && isNaN(z)){       //solo x e y  
                 calculaMCD(x,y);  
             } else if (!isNaN(x) && !isNaN(y) && !isNaN(z)){   //intervienen x, y, z  
                 calculaMCD(x,y);  
                 calculaMCD(mcd,z);                 //propiedad recursiva para calcular el MCD de tres números  
             }  
             var text2="MCD="+mcd          
   }  
         document.getElementById("calculo").innerHTML = text;  
         document.getElementById("calculo2").innerHTML = text2;  
         document.getElementById("calculo2").style.color="blue";  
         var text3=x+' / '+mcd+' = '+x/mcd+'<br>'+y+' / '+mcd+' = '+y/mcd+'<br>';  
         if (!isNaN(z)){text3 += z+' / '+mcd+' = '+z/mcd+'<br>'}  
         document.getElementById("calculo3").innerHTML = text3;  
         document.getElementById("calculo3").style.color="magenta";  
 }  
 function calculaMCD(n1,n2){  
     if (n2>n1){                       //queremos que n1 sea el mayor  
         var aux=n1;  
         n1=n2;  
         n2=aux  
     }  
     var a=n1;  
     var b=n2;  
     do {                           //algoritmo de Euclides  
         mcd=n2;  
         var resto=n1%n2;  
         n1=n2;  
         n2=resto;  
     } while (resto!=0);  
 }  
 function factorizame(n){  
     resulta=n+' = ';  
     var contador=0;  
     while (n%2===0) {  
           n=n/2;  
           contador++;  
     }  
     if (contador>1){  
         resulta += 2+"<sup>"+contador+"</sup> × ";  
     } else if (contador===1){  
         resulta += "2 × ";  
     }  
     for (var i=3;i<=n;i=i+2){  
         contador=0;  
         while (n%i===0) {  
               n=n/i;  
               contador++;  
         }  
         if (contador>1){  
             resulta += i+"<sup>"+contador+"</sup> × ";  
         } else if (contador===1){  
             resulta += i+" × ";  
         }  
     }  
         resulta += 1;  
 }  

Puedes probar el programa en el siguiente enlace.