Calcular MCD y mcm con javascript

publicado por: Anonymous

Estaba intentando averiguar como calcular el mcm y MCD (princpalmente el máximo comun divisor) en javascript, o, si es más facil, jquery.
He buscado por internet, pero lo mejor que he encontrado es esto:

_x000D_

_x000D_

function MCD(){_x000D_
    if (arguments.length<2) return false;_x000D_
    if (arguments.length==2)return (arguments[1]==0?arguments[0]:MCD(arguments[1],arguments[0]%arguments[1]));_x000D_
    var arr=[].splice.call(arguments,0);_x000D_
    arr.splice(0,2,MCD(arr[0],arr[1]));_x000D_
    return MCD.apply(window,arr);_x000D_
}_x000D_
function mcm(a,b){_x000D_
    if (arguments.length<2) return false;_x000D_
    if (arguments.length==2)return arguments[0]*arguments[1]/MCD(arguments[0],arguments[1]);_x000D_
    var arr=[].splice.call(arguments,0);_x000D_
    arr.splice(0,2,mcm(arr[0],arr[1]));_x000D_
    return mcm.apply(window,arr);_x000D_
}_x000D_
_x000D_
console.log(MCD(36, 12, 96));//Esto es lo que quiero cambiar_x000D_
console.log(mcm.apply(window,[36, 12, 96]));//Esto es lo que quiero cambiar

_x000D_

_x000D_

_x000D_

He encontrado eso aquí:
f13/propuesta-para-desafios-javascript-2014-a-1085152/index4.html (no dejo el nombre de la web porque si no me banean, pero si buscais eso por internet os sale).
La cosa es que he intentado de mil maneras poner un input que sirva para que su value reemplaze a ese console.log(MCD(36, 12, 96));
Edit:”Basicamente, quiero que los números 36, 12, 96 los tome de un input, pero lo he intentado con document.getElementById().value y no funciona”
Gracias de antemano. ^-^

solución

Como te digo en mi comentario, los elementos input de HTML almacenan un valor tipo string en su propiedad value. Por lo tanto debes hacer una serie de operaciones para convertir los datos que obtienes del input.

PROBLEMA

Se dispone de un solo elemento tipo input para ingresar 1, 2, 3 o más valores numéricos separados por coma. Dichos valores serán enviados como argumento a las funciones de Mínimo Común Múltiplo y de Máximo Común Divisor.

SOLUCIÓN

Debemos crear una función que nos permita extraer los números introducidos en el elemento input. Usaremos un bucle for y el método substring() de Javascript, asi como la función parseInt(). Además usaremos el método apply para pasar los argumentos a las funciones MCD y mcm.

_x000D_

_x000D_

// Funcion que clacula el MCD_x000D_
function MCD(){_x000D_
  if (arguments.length<2) return false;_x000D_
  if (arguments.length==2)return (arguments[1]==0?arguments[0]:MCD(arguments[1],arguments[0]%arguments[1]));_x000D_
  var arr=[].splice.call(arguments,0);_x000D_
  arr.splice(0,2,MCD(arr[0],arr[1]));_x000D_
  return MCD.apply(window,arr);_x000D_
}_x000D_
_x000D_
// Funcion que calcula el mcm_x000D_
function mcm(a,b){_x000D_
  if (arguments.length<2) return false;_x000D_
  if (arguments.length==2)return arguments[0]*arguments[1]/MCD(arguments[0],arguments[1]);_x000D_
  var arr=[].splice.call(arguments,0);_x000D_
  arr.splice(0,2,mcm(arr[0],arr[1]));_x000D_
  return mcm.apply(window,arr);_x000D_
}_x000D_
_x000D_
// La siguiente función recoge el valor de 'input'_x000D_
// extrae los números y descarta las comas,_x000D_
// convierte los números en enteros_x000D_
// y los inserta en un array_x000D_
function calcularMCDmcm() {_x000D_
  var input = document.getElementById('dataInput').value;_x000D_
  var numbers = []; // array que almacenará nuestros números_x000D_
  var idx = 0;  // indicador para usar como 'start position' del metodo substring_x000D_
_x000D_
  // el siguiente bucle recorre cada caracter de nuestro string_x000D_
  for(var i = 0; i < input.length; i++) {_x000D_
    if (input[i] == ',') {  // verificamos si es una coma (,)_x000D_
      numbers.push(parseInt(input.substring(idx,i))); // extraemos el número y lo agregamos al array_x000D_
      idx = i + 1; // marcamos el nuevo 'start-position'_x000D_
    } else if (i == input.length - 1) { // si llegamos al final de la cadena_x000D_
      numbers.push(parseInt(input.substring(idx)));  // extraemos el último numero y lo agregamos al array_x000D_
    }_x000D_
  }_x000D_
  _x000D_
  // ahora ya podemos usar el método 'apply' con nuestras funciones MCD y mcm_x000D_
  document.getElementById('MCD').innerText = 'El MCD es: ' +  MCD.apply(window, numbers);_x000D_
  document.getElementById('mcm').innerText = 'El mcm es: ' +  mcm.apply(window, numbers);_x000D_
_x000D_
  // también lo puedes usar en la cónsola._x000D_
  console.log('MCD:', MCD.apply(window, numbers));_x000D_
  console.log('mcm: ', mcm.apply(window, numbers));_x000D_
_x000D_
}

_x000D_

<body>_x000D_
  <form id="mcmMCD" name="mcmMCD" style="padding-top: 1rem">_x000D_
    <label forHTML="dataInput">Introduzca números enteros separados por coma: </label>_x000D_
    <br><br>_x000D_
    <input type="text" id="dataInput" name="dataInput" size="30" placeholder="32,12,96" pattern="^d+[0-9,]+d+$" required/>_x000D_
    <button type="button" onclick="calcularMCDmcm()">Calcular</button>_x000D_
    <br><br>_x000D_
    <div id="MCD"></div>_x000D_
    <div id="mcm"></div>_x000D_
  </form>_x000D_
</body>

_x000D_

_x000D_

_x000D_

En el código HTML he agregado una etiqueta required al input, así como una etiqueta pattern con una expresión regular que verifica que el input solo contiene dígitos del 0 al 9 y comas, además solo permite números al principo y al final de la cadena, esto es para no romper la lógica de la función que extrae los números.

CONCLUSION

Usando el método apply del objeto Function de Javascript, podemos usar un array para pasar argumentos a nuestra función.

Esta es una forma muy práctica de usar argumentos dinámicamente. El ejemplo aqui planteado, demuestra la versatilidad del método, ya que podemos pasar una gran lista de números separados por coma sin tener que escribir una llamada para cada cambio en la cantidad de elementos.

Referencias:

Function.prototype.apply()

HTML pattern Attribute

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *