Files

157 lines
4.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: 599d1566a02b571412643b84
title: Ефіопське множення
challengeType: 5
forumTopicId: 302257
dashedName: ethiopian-multiplication
---
# --description--
Ефіопське множення - це метод множення цілих чисел за допомогою лише додавання, подвоєння та ділення на два.
**Метод:**
<ol>
<li>Візьміть два числа, щоб помножити і записати їх зверху двох стовпчиків</li>
<li>У лівому стовпчику діліть на два останнє число кілька разів, відкидаючи будь-які остачі, і записуйте результат нижче в цей самий стовпчик, поки не запишете значення <code>1</code></li>
<li>У правій колонці множте на два останнє число повторювано і запишіть результат нижче. зупиніться, коли ви вписали число в тому ж рядку, де лівий стовпчик показує <code>1</code></li>
<li>Перегляньте отриману таблицю, і відкиньте будь-який рядок, де значення в лівому стовпчику - парне</li>
<li>Підсумуйте значення в правому стовпчику так, щоб отримати результат множення двох початкових цифр</li>
</ol>
** Наприклад:** `17 × 34`
<pre>17 34
</pre>
Ділимо перший стовпчик:
<pre>17 34
8
4
2
1
</pre>
Множимо на два другий стовпчик:
<pre>17 34
8 68
4 136
2 272
1 544
</pre>
Закреслюємо рядки, в яких перша комірка парна:
<pre>17 34
8 <strike>68</strike>
4 <strike>136</strike>
2 <strike>272</strike>
1 544
</pre>
Підсумовуємо решту цифр в правому стовпчику:
<!-- markdownlint-disable MD003 -->
<pre>17 34
8 --
4 ---
2 ---
1 544
====
578
</pre>
<!-- markdownlint-enable MD003 -->
Отже `17` помножене `34`, за ефіопським методом - `578`.
# --instructions--
Завданням полягає в тому, щоб визначити три іменовані функції, методи, процедури, підпрограми:
<ol>
<li>від одиниці до половини цілого числа,</li>
<li>від одиниці до подвійного цілого, і</li>
<li>від одиниці до моменту, коли ціле число є парним</li>
</ol>
Використовуйте ці функції, щоб створити функцію, яка виконує ефіопське множення.
<!-- markdownlint-disable MD046-->
# --hints--
`eth_mult` має бути функцією.
```js
assert(typeof eth_mult === 'function');
```
`eth_mult(17,34)` має повертати `578`.
```js
assert.equal(eth_mult(17, 34), 578);
```
`eth_mult(23,46)` має повертати `1058`.
```js
assert.equal(eth_mult(23, 46), 1058);
```
`eth_mult(12,27)` має повертати `324`.
```js
assert.equal(eth_mult(12, 27), 324);
```
`eth_mult(56,98)` має повертати `5488`.
```js
assert.equal(eth_mult(56, 98), 5488);
```
`eth_mult(63,74)` має повертати `4662`.
```js
assert.equal(eth_mult(63, 74), 4662);
```
# --seed--
## --seed-contents--
```js
function eth_mult(a, b) {
}
```
# --solutions--
```js
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];
}
```