3.8 KiB
3.8 KiB
title, id, localeTitle, challengeType
title | id | localeTitle | challengeType |
---|---|---|---|
Ethiopian multiplication | 599d1566a02b571412643b84 | 599d1566a02b571412643b84 | 5 |
Description
La multiplicación etíope es un método para multiplicar enteros utilizando solo la suma, el doblado y la reducción a la mitad.
Método:
Toma dos números para multiplicarlos y escríbelos en la parte superior de las dos columnas. En la columna de la izquierda, reduzca a la mitad el último número, descartando cualquier resto, y escriba el resultado debajo del último en la misma columna, hasta que escriba un valor de 1. En la columna de la derecha, doble el número de la última vez y Escribe el resultado a continuación. deténgase cuando agregue un resultado en la misma fila donde la columna de la izquierda muestra 1. Examine la tabla producida y descarte cualquier fila donde el valor en la columna de la izquierda sea par. Suma los valores en la columna de la derecha que quedan para producir el resultado de multiplicar los dos números originales juntosPor ejemplo: 17 × 34.
17 34
Reduciendo a la mitad la primera columna:
17 34
8
4
2
1
Duplicando la segunda columna:
17 34
8 68
4 136
2 272
1 544
Filas tachadas cuya primera celda es par:
17 34
8 68
4 136
2 272
1 544
Suma los números restantes en la columna de la derecha:
17 34
8 -
4 ---
2 ---
1 544
====
578
Entonces 17 multiplicado por 34, por el método etíope es 578.
Tarea:La tarea es definir tres funciones nombradas / métodos / procedimientos / subrutinas:
uno para reducir a la mitad un número entero, uno para duplicar un número entero y uno para indicar si un número entero es par.Usa estas funciones para crear una función que haga la multiplicación etíope.
Instructions
Tests
tests:
- text: <code>eth_mult</code> es una función.
testString: 'assert(typeof eth_mult === "function", "<code>eth_mult</code> is a function.");'
- text: ' <code>eth_mult(17,34)</code> debe devolver <code>578</code> '
testString: 'assert.equal(eth_mult(17, 34), 578, "<code>eth_mult(17,34)</code> should return <code>578</code>.");'
- text: ' <code>eth_mult(23,46)</code> debe devolver <code>1058</code> '
testString: 'assert.equal(eth_mult(23, 46), 1058, "<code>eth_mult(23,46)</code> should return <code>1058</code>.");'
- text: ' <code>eth_mult(12,27)</code> debe devolver <code>324</code> '
testString: 'assert.equal(eth_mult(12, 27), 324, "<code>eth_mult(12,27)</code> should return <code>324</code>.");'
- text: ' <code>eth_mult(56,98)</code> debe devolver <code>5488</code> '
testString: 'assert.equal(eth_mult(56, 98), 5488, "<code>eth_mult(56,98)</code> should return <code>5488</code>.");'
- text: ' <code>eth_mult(63,74)</code> debe devolver <code>4662</code> '
testString: 'assert.equal(eth_mult(63, 74), 4662, "<code>eth_mult(63,74)</code> should return <code>4662</code>.");'
Challenge Seed
function eth_mult (a, b) {
// Good luck!
}
Solution
function eth_mult(a, b) {
let sum = 0; a = [a]; b = [b];
let half = a => a / 2,
double = a => a * 2,
is_even = a => a % 2 == 0;
while (a[0] !== 1) {
a.unshift(Math.floor(half(a[0])));
b.unshift(double(b[0]));
}
for (let i = a.length - 1; i > 0; i -= 1) {
if (!is_even(a[i])) {
sum += b[i];
}
}
return sum + b[0];
}