四則演算と剰余
5 / 2 の答えが 2 になる
キーボードに × と ÷ が無いので、掛け算は *、割り算は / と書きます。+ と - はそのままです。ここまでは紙の計算と同じ感覚で通じますが、/ だけは結果が変わります。
Java
int a = 5 / 2; // 2.5 ではなく 2
int b = 1 / 3; // 0.333... ではなく 0
int c = -5 / 2; // -2int を int で割った答えは int になります。int には小数を置く場所が無いので、小数の部分は四捨五入されるのではなく、そのまま捨てられます。これは不具合ではなく仕様です。
平均点を出すつもりで (a + b) / 2 と書き、答えが 1 点低いまま気づかない、というのが定番の事故です。小数まで欲しいときは、どちらか片方を小数にします。
Java
double avg = (5 + 2) / 2.0; // 3.52 を 2.0 と書いただけで、割り算全体が小数の世界に移ります。
% は、割り切れずに残った分を返す
捨てられた小数の代わりに「余り」を取り出す演算子が % です。10 % 3 は 1、8 % 4 は 0、7 % 2 は 1 になります。
余りは、単なる算数の道具以上によく使います。n % 2 が 0 なら偶数、n % 3 が 0 なら 3 の倍数だと分かるからです。
Java
int n = 14;
boolean isEven = (n % 2 == 0); // true/ が「何回入ったか」を返すのに対して、% は「入りきらずに残ったのは何か」を返します。この 2 つは同じ割り算の別々の答えだと考えてください。10 / 3 の 3 と 10 % 3 の 1 を合わせれば、元の 10 の内訳が分かります。
0 で割ると、そこで落ちる
/ も % も、右側が 0 だと ArithmeticException: / by zero を投げてプログラムが止まります。おかしな値が返るのではなく、その行で停止します。
Java
int x = 10 / 0; // ここで停止する
int y = 10 % 0; // これも同じく停止する割る数が外から渡ってくる場合、0 が来ないという保証はどこにもありません。だから割る前に if で確かめ、0 のときは割り算そのものをせずに、あらかじめ決めた値を返します。実務でも必ず書く守りのコードです。
やってみよう
calculate(int a, int b) を完成させ、a + b = 13, a - b = 7, ... の形で 5 つの結果を 1 本の文字列にまとめてください。
bが0でないときだけ、割り算と余りを計算するbが0のときは、a / bとa % bの場所を0にする- 実行して、
10, 3と8, 4と7, 0の 3 件が通ることを確かめる
組み立てで 1 か所だけ注意があります。"a + b = " + a + b と書くと、左から順につながって a と b が並んだ文字列になってしまいます。先に足し算をさせたいので、(a + b) のようにカッコで囲んでください。
要件
- クラス名は
Solution、メソッド名はcalculate、引数はint a, int bの 2 つ、戻り値の型はStringにすること - 出力フォーマットは
"a + b = X, a - b = Y, a * b = Z, a / b = W, a % b = V"の形 (カンマの後ろは半角スペース 1 個、=の前後にも半角スペース) b == 0の場合はa / bとa % bの部分を0にし、ArithmeticExceptionを発生させないこと
入出力例
calculate(10, 3) → "a + b = 13, a - b = 7, a * b = 30, a / b = 3, a % b = 1"
calculate(8, 4) → "a + b = 12, a - b = 4, a * b = 32, a / b = 2, a % b = 0"
calculate(7, 0) → "a + b = 7, a - b = 7, a * b = 0, a / b = 0, a % b = 0"