Hoy vamos a resolver un ejercicio de JavaScript. Se trata de un programa para convertir un número en monedas y billetes de distinta denominación. El mismo dice así:
Escribe una función de JavaScript para convertir una cantidad X de dinero en monedas o billetes. A la función se le deben pasar los valores de las monedas y billetes en las que queremos cambiar mediante un array
Veamos un ejemplo…
Entrada:
Salida: 25, 10, 10, 1
Básicamente sirve para saber cuántas monedas y billetes vas a usar si vas a dar una determinada cantidad de dinero.
Por ejemplo, supongamos que solo existen billetes de 20, 50 y 100 pesos. Si tuviera que dar 290 pesos daría 2 billetes de 100, 1 de 50 y 2 de 20.
Nota: aquí se prefiere dar primero los billetes o monedas más grandes.
Al ejecutar esto en el programa de JavaScript, la salida es: 100, 100, 50, 20, 20
Lo cual es correcto.
Primero ordenamos el arreglo de las denominaciones disponibles para que quede ordenado de mayor a menor. Ahora nos enfocamos en la cantidad de dinero.
Recorremos las denominaciones disponibles y mientras la cantidad de dinero sea mayor o igual a la denominación actual, vamos a colocar esa denominación en una lista e ir restándola de la cantidad de dinero.
Al final vamos a terminar de recorrer todas las monedas y por lo tanto la cantidad de dinero llegará a 0. Finalmente regresamos las denominaciones usadas, mismas que tendrán los billetes y monedas que vamos a usar.
Nota: debemos garantizar que las denominaciones sean las suficientes para dar cualquier cantidad de dinero, pues si no, podríamos caer en un ciclo infinito.
Entonces el código queda como se ve a continuación. He encerrado todo el comportamiento en una función:
const dineroAMonedas = (cantidad, monedas) => {
/*
https://parzibyte.me/blog
*/ // Primero ordenamos las monedas de mayor a menor:
// https://parzibyte.me/blog/2018/10/28/ordenar-arreglos-javascript-sort/#Ordenar_arreglo_de_enteros_ascendente
monedas.sort((unNumero, otroNumero) => otroNumero - unNumero);
const monedasUsadas = [];
for (const moneda of monedas) {
while (cantidad >= moneda) {
monedasUsadas.push(moneda);
cantidad -= moneda;
}
}
return monedasUsadas;
};
Primero ordenamos las denominaciones (billetes y monedas) en la línea 7. Luego declaramos la lista de las monedas y billetes que vamos a usar en la línea 8.
Recorremos las denominaciones en la línea 9, y mientras la cantidad sea mayor o igual que la denominación actual, la agregamos a las monedas usadas con push (línea 11) además de restar esa denominación de la cantidad.
Finalmente regresamos las monedas y billetes usados en la línea 15. Todo esto programando con JavaScript.
Finalmente veamos el modo de uso para ver el código completo. Queda como se ve a continuación:
const dineroAMonedas = (cantidad, monedas) => {
/*
https://parzibyte.me/blog
*/ // Primero ordenamos las monedas de mayor a menor:
// https://parzibyte.me/blog/2018/10/28/ordenar-arreglos-javascript-sort/#Ordenar_arreglo_de_enteros_ascendente
monedas.sort((unNumero, otroNumero) => otroNumero - unNumero);
const monedasUsadas = [];
for (const moneda of monedas) {
while (cantidad >= moneda) {
monedasUsadas.push(moneda);
cantidad -= moneda;
}
}
return monedasUsadas;
};
const cantidad = 290;
const billetes = [100, 50, 20];
const monedasYBilletes = dineroAMonedas(cantidad, billetes);
console.log("Dada la cantidad %f y los billetes %s, pueden representarse con: %s", cantidad, billetes, monedasYBilletes);
Al momento de ejecutarlo la salida es correcta, es el ejemplo que usé al inicio:
Recuerda que como estamos programando en JavaScript esto puede correr en el servidor o en el cliente.
Para terminar te dejo con más tutoriales de JavaScript en mi blog.
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.