CODE Polyglot / 入門 / 第2回

四則演算 — 足し算・引き算・掛け算・割り算

2つの整数を受け取って、足し算・引き算・掛け算・割り算と、割り算の商と余りを出します。同じ「7 ÷ 2」でも、言語によって 3.5 になったり 3 になったりします。

画面にこう出れば正解

どの言語で書いても、同じ入力なら画面に出る文字は1文字も違わない、というのが正解の決め方です(例は Python で動かしたときのコマンドです)。

割り切れない(7 ÷ 2)

$ python3 calc.py 7 2
7 + 2 = 9
7 - 2 = 5
7 × 2 = 14
7 ÷ 2 = 3.5
7 ÷ 2 の商は 3、余りは 1

割り切れる(9 ÷ 3)

$ python3 calc.py 9 3
9 + 3 = 12
9 - 3 = 6
9 × 3 = 27
9 ÷ 3 = 3
9 ÷ 3 の商は 3、余りは 0

小数になる(1 ÷ 8)

$ python3 calc.py 1 8
1 + 8 = 9
1 - 8 = -7
1 × 8 = 8
1 ÷ 8 = 0.125
1 ÷ 8 の商は 0、余りは 1

負の数(−7 ÷ 2)

$ python3 calc.py -7 2
-7 + 2 = -5
-7 - 2 = -9
-7 × 2 = -14
-7 ÷ 2 = -3.5
-7 ÷ 2 の商は -4、余りは 1

10 ÷ 4

$ python3 calc.py 10 4
10 + 4 = 14
10 - 4 = 6
10 × 4 = 40
10 ÷ 4 = 2.5
10 ÷ 4 の商は 2、余りは 2

0 で割る

$ python3 calc.py 5 0
0 では割れません

10言語のプログラム

どれもそのまま保存して動かせます。毎朝、上の正解の例をすべて実際に動かして確かめています。

calc.php8.4.26 で 6 / 6 件の出力が正解と一致

<?php
// 2つの整数で、足し算・引き算・掛け算・割り算をする
$a = (int) $argv[1];
$b = (int) $argv[2];
if ($b === 0) {
    echo "0 では割れません\n";
    exit;
}
// 商と余り: 余りが 0 以上になるようにそろえる(-7 ÷ 2 は 商 -4、余り 1)
$q = intdiv($a, $b);
$r = $a % $b;
if ($r < 0) {
    $r += $b;
    $q -= 1;
}
echo "$a + $b = " . ($a + $b) . "\n";
echo "$a - $b = " . ($a - $b) . "\n";
echo "$a × $b = " . ($a * $b) . "\n";
echo "$a ÷ $b = " . ($a / $b) . "\n";
// 日本語の直前の変数は {} で囲む("$q、" と書くと「$q、」までが変数名になる)
echo "$a ÷ $b の商は {$q}、余りは {$r}\n";

動かし方(ファイルを保存したフォルダで) ・ PHP を入れる

$ php calc.php 7 2

言語でつまずきやすいところ

初心者がよく書く形(各言語で最初に習う書き方をそのまま使ったもの)を、同じ正解表で動かした結果です。言語を出した答えごとにまとめ、赤い字はその言語が実際に出した間違った行です。

入力初心者がよく書く形の答え(10言語)
割り切れない(7 ÷ 2)7 2
  • Go・Java・C#・Rust・Ruby・Kotlin・Swift7 ÷ 2 = 3
  • PHP・Python・JavaScript✓ 正解
割り切れる(9 ÷ 3)9 3
  • Python9 ÷ 3 = 3.0
  • PHP・Go・JavaScript・Java・C#・Rust・Ruby・Kotlin・Swift✓ 正解
小数になる(1 ÷ 8)1 8
  • Go・Java・C#・Rust・Ruby・Kotlin・Swift1 ÷ 8 = 0
  • PHP・Python・JavaScript✓ 正解
負の数(−7 ÷ 2)-7 2
  • PHP-7 ÷ 2 の商は -3、余りは -1
  • Go・Java・C#・Rust・Kotlin・Swift-7 ÷ 2 = -3
    -7 ÷ 2 の商は -3、余りは -1
  • JavaScript-7 ÷ 2 の商は -4、余りは -1
  • Ruby-7 ÷ 2 = -4
  • Python✓ 正解
10 ÷ 410 4
  • Go・Java・C#・Rust・Ruby・Kotlin・Swift10 ÷ 4 = 2
  • PHP・Python・JavaScript✓ 正解
0 で割る5 0
  • PHP・Python・Go・Java・C#・Rust・Ruby・Kotlin・Swiftエラーで止まった
  • JavaScript5 + 0 = 5
    5 - 0 = 5
    5 × 0 = 0
    5 ÷ 0 = Infinity
    5 ÷ 0 の商は Infinity、余りは NaN

この回でやること

  • 文字として受け取った数字を、計算できる数(整数)に変える
  • +・-・*・/・% で計算する
  • 0 で割らないように確かめる

解説

数字の文字を、数に変える

コマンドライン引数は、数字に見えても「文字」として渡されます。"7" + "2" は、多くの言語で "72"(文字のつなげ合わせ)になってしまいます。計算する前に int()・Number()・Integer.parseInt() などで整数に変えます。

割り算は、言語で答えが変わる

「整数 ÷ 整数」の答えは、言語によって違います。

言語7 / 2 の答え9 / 3 の答え
Python・JavaScript・PHP3.53.0(Python)・3(JavaScript・PHP)
Go・Java・C#・Rust・Ruby3(小数を切り捨て)3

Go・Java・C#・Rust・Ruby で 3.5 を出すには、先にどちらかを小数の型(double・float64 など)に変えてから割ります。Python の / は、割り切れても 3.0 のように小数で答えるので、整数で見せたいときは直します。

商と余りは、負の数で言語が分かれる

−7 ÷ 2 の商と余りは、決め方が2つあります。

  • 余りを 0 以上にする(数学の決め方): 商 −4、余り 1
  • 商を 0 の方へ切り捨てる: 商 −3、余り −1

Python と Ruby の //・/・% は前者、Go・Java・C#・Rust・JavaScript・PHP の /(整数)・% は後者です。この回では「余りは 0 以上」で書いています。Java の Math.floorDiv・Math.floorMod、Rust の div_euclid・rem_euclid のように、前者の答えを出す関数がある言語もあります。

0 では割れない

0 で割ると、多くの言語はエラーで止まります(JavaScript は Infinity という値になります)。割る前に 0 かどうかを確かめます。

練習

  1. 「7 ÷ 2 = 3.5」の行を「7 ÷ 2 ≒ 3.5」に変えてみましょう
  2. 2つの数の平均(足して2で割る)を出す行を足してみましょう。整数どうしの割り算に気をつけます