4.5 KiB
4.5 KiB
title, id, challengeType, forumTopicId, localeTitle
title | id | challengeType | forumTopicId | localeTitle |
---|---|---|---|---|
Ethiopian multiplication | 599d1566a02b571412643b84 | 5 | 302257 | Эфиопское умножение |
Description
Эфиопское умножение - это метод умножения целых чисел, использующий только добавление, удвоение и уменьшение пополам.
Метод:
Возьмите два числа, чтобы их умножить и записать их в верхней части двух столбцов. В левом столбце повторите половину последнего номера, отбрасывая любые остатки и записывая результат ниже последнего в том же столбце, пока не напишите значение 1. В правом столбце многократно удвоите последнее число и запишите результат ниже. остановитесь, когда вы добавите результат в ту же строку, что и в столбце слева. 1. Изучите созданную таблицу и отбросьте любую строку, где значение в левом столбце четное. Суммируйте значения в правой колонке, которые останутся для получения результата умножения исходных двух чисел вместеНапример: 17 × 34
17 34
Половина первого столбца:
17 34
8
4
2
1
Удвоение второй колонки:
17 34
8 68
4 136
2 272
1 544
Stratch-out rows, чья первая ячейка четная:
17 34
8 68
4 136
2 272
1 544
Суммируйте оставшиеся числа в правом столбце:
17 34
8 -
4 ---
2 ---
1 544
====
578
Так 17, умноженное на 34, по эфиопскому методу - 578.
Задача:Задача состоит в том, чтобы определить три названные функции / методы / процедуры / подпрограммы:
один на половину целого числа, один для двойного целого числа, и один, чтобы указать, является ли целое четным.Используйте эти функции для создания функции, которая делает эфиопское умножение.
Instructions
- one to halve an integer,
- one to double an integer, and
- one to state if an integer is even
Tests
tests:
- text: <code>eth_mult</code> is a function.
testString: assert(typeof eth_mult === 'function');
- text: <code>eth_mult(17,34)</code> should return <code>578</code>.
testString: assert.equal(eth_mult(17, 34), 578);
- text: <code>eth_mult(23,46)</code> should return <code>1058</code>.
testString: assert.equal(eth_mult(23, 46), 1058);
- text: <code>eth_mult(12,27)</code> should return <code>324</code>.
testString: assert.equal(eth_mult(12, 27), 324);
- text: <code>eth_mult(56,98)</code> should return <code>5488</code>.
testString: assert.equal(eth_mult(56, 98), 5488);
- text: <code>eth_mult(63,74)</code> should return <code>4662</code>.
testString: assert.equal(eth_mult(63, 74), 4662);
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];
}