2022-01-21 01:00:18 +05:30
|
|
|
|
---
|
|
|
|
|
id: 599d1566a02b571412643b84
|
2022-01-22 20:38:20 +05:30
|
|
|
|
title: エチオピア乗算
|
2022-01-21 01:00:18 +05:30
|
|
|
|
challengeType: 5
|
|
|
|
|
forumTopicId: 302257
|
|
|
|
|
dashedName: ethiopian-multiplication
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
# --description--
|
|
|
|
|
|
2022-01-22 20:38:20 +05:30
|
|
|
|
エチオピア乗算は、加算、倍増、および半減のみを使用して整数を乗算する方法です。
|
2022-01-21 01:00:18 +05:30
|
|
|
|
|
2022-01-22 20:38:20 +05:30
|
|
|
|
**方法:**
|
2022-01-21 01:00:18 +05:30
|
|
|
|
|
|
|
|
|
<ol>
|
2022-01-22 20:38:20 +05:30
|
|
|
|
<li>乗算対象の2つの数を取り、2つの列の上に書きます。</li>
|
|
|
|
|
<li>左側の列で、最後の数字を繰り返し2で割り、残りを捨て、値が <code>1</code> になるまで同じ列の最後に結果を書き込みます。</li>
|
|
|
|
|
<li>右側の列で、繰り返し最後の数字を2倍にして、結果を列の最後に書きます。 左側の列に <code>1</code> が表示されている行まで結果を入れ、その後停止します。</li>
|
|
|
|
|
<li>出来上がったテーブル見て、左側の列の値が偶数である行を削除します。</li>
|
|
|
|
|
<li>残っている右側の列の値を加算すると、元の2つの数を乗算した結果になります。</li>
|
2022-01-21 01:00:18 +05:30
|
|
|
|
</ol>
|
|
|
|
|
|
2022-01-22 20:38:20 +05:30
|
|
|
|
**例:** `17 × 34`
|
2022-01-21 01:00:18 +05:30
|
|
|
|
|
|
|
|
|
<pre>17 34
|
|
|
|
|
</pre>
|
|
|
|
|
|
2022-01-22 20:38:20 +05:30
|
|
|
|
最初の列の値を2で割ります。
|
2022-01-21 01:00:18 +05:30
|
|
|
|
|
|
|
|
|
<pre>17 34
|
|
|
|
|
8
|
|
|
|
|
4
|
|
|
|
|
2
|
|
|
|
|
1
|
|
|
|
|
</pre>
|
|
|
|
|
|
2022-01-22 20:38:20 +05:30
|
|
|
|
2列目を倍にします。
|
2022-01-21 01:00:18 +05:30
|
|
|
|
|
|
|
|
|
<pre>17 34
|
|
|
|
|
8 68
|
|
|
|
|
4 136
|
|
|
|
|
2 272
|
|
|
|
|
1 544
|
|
|
|
|
</pre>
|
|
|
|
|
|
2022-01-22 20:38:20 +05:30
|
|
|
|
最初の列が偶数の行の値を消します。
|
2022-01-21 01:00:18 +05:30
|
|
|
|
|
|
|
|
|
<pre>17 34
|
|
|
|
|
8 <strike>68</strike>
|
|
|
|
|
4 <strike>136</strike>
|
|
|
|
|
2 <strike>272</strike>
|
|
|
|
|
1 544
|
|
|
|
|
</pre>
|
|
|
|
|
|
2022-01-22 20:38:20 +05:30
|
|
|
|
右側の列の残りの数字を合計します。
|
2022-01-21 01:00:18 +05:30
|
|
|
|
|
|
|
|
|
<!-- markdownlint-disable MD003 -->
|
|
|
|
|
|
|
|
|
|
<pre>17 34
|
|
|
|
|
8 --
|
|
|
|
|
4 ---
|
|
|
|
|
2 ---
|
|
|
|
|
1 544
|
|
|
|
|
====
|
|
|
|
|
578
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<!-- markdownlint-enable MD003 -->
|
|
|
|
|
|
2022-01-22 20:38:20 +05:30
|
|
|
|
エチオピア乗算で `17` に `34` を掛けると `578` になります。
|
2022-01-21 01:00:18 +05:30
|
|
|
|
|
|
|
|
|
# --instructions--
|
|
|
|
|
|
2022-01-22 20:38:20 +05:30
|
|
|
|
タスクは、3つの名前付き関数/メソッド/プロシージャ/サブルーチンを定義することです。
|
2022-01-21 01:00:18 +05:30
|
|
|
|
|
|
|
|
|
<ol>
|
2022-01-22 20:38:20 +05:30
|
|
|
|
<li>整数を半分にする</li>
|
|
|
|
|
<li>整数を2倍にする</li>
|
|
|
|
|
<li>整数が偶数かどうかを示す</li>
|
2022-01-21 01:00:18 +05:30
|
|
|
|
</ol>
|
|
|
|
|
|
2022-01-22 20:38:20 +05:30
|
|
|
|
これらを使ってエチオピア乗算を行う関数を作ります。
|
2022-01-21 01:00:18 +05:30
|
|
|
|
|
|
|
|
|
<!-- markdownlint-disable MD046-->
|
|
|
|
|
|
|
|
|
|
# --hints--
|
|
|
|
|
|
2022-01-22 20:38:20 +05:30
|
|
|
|
`eth_mult` という関数です。
|
2022-01-21 01:00:18 +05:30
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
assert(typeof eth_mult === 'function');
|
|
|
|
|
```
|
|
|
|
|
|
2022-01-22 20:38:20 +05:30
|
|
|
|
`eth_mult(17,34)` は `578` を返します。
|
2022-01-21 01:00:18 +05:30
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
assert.equal(eth_mult(17, 34), 578);
|
|
|
|
|
```
|
|
|
|
|
|
2022-01-22 20:38:20 +05:30
|
|
|
|
`eth_mult(23,46)` は `1058` を返します。
|
2022-01-21 01:00:18 +05:30
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
assert.equal(eth_mult(23, 46), 1058);
|
|
|
|
|
```
|
|
|
|
|
|
2022-01-22 20:38:20 +05:30
|
|
|
|
`eth_mult(12,27)` は `324` を返します。
|
2022-01-21 01:00:18 +05:30
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
assert.equal(eth_mult(12, 27), 324);
|
|
|
|
|
```
|
|
|
|
|
|
2022-01-22 20:38:20 +05:30
|
|
|
|
`eth_mult(56,98)` は `5488` を返します。
|
2022-01-21 01:00:18 +05:30
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
assert.equal(eth_mult(56, 98), 5488);
|
|
|
|
|
```
|
|
|
|
|
|
2022-01-22 20:38:20 +05:30
|
|
|
|
`eth_mult(63,74)` は `4662` を返します。
|
2022-01-21 01:00:18 +05:30
|
|
|
|
|
|
|
|
|
```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];
|
|
|
|
|
}
|
|
|
|
|
```
|