剰余算を使いこなして、便利にプログラミングしよう

+ や – などの「算術演算子」のうち、余りを求める「剰余算」の演算子は大抵のプログラム言語に実装されています。

例えば、JavaScriptや PHPで「10 % 3」という計算式の答えは「1」。10を 3で割ったときの余りを求めることができます。しかしこの演算子、通常の計算で利用することはほとんどないでしょう。しかし、使い方によっては非常に便利な演算子なのです。その使い方を紹介しましょう。

偶数・奇数を求める

例えば「丁半ゲーム」などを作りたい場合、奇数か偶数かを知る必要があります。そんな時は、2で割ってみてその余りが 0なら偶数、1なら奇数であることが分かります。

let x = 10;
if (x % 2 === 1) {
  document.write('奇数です');
} else {
  document.write('偶数です');
}

1(true)の条件は省略できる

ちなみに余談ですがこのプログラム、if構文の中は次のように省略できます。

if (x % 2) {

JavaScriptなどは標準で条件が、true(1)かどうかは判定してくれるため、省略しても同じ結果になります。

三項演算子でさらに楽に

さらに、このような「条件の結果でやりたい作業が似ている」場合、if構文を使うよりも「三項演算子」を使った方がスッキリと書けます。次のような構文です。

(条件 ? trueの場合 : falseの場合)

上記のプログラムを書き換えると、次のようになります。

document.write(x % 2 ? '奇数です' : '偶数です');

以降はこの書式を使っていくのでご注意ください。

○秒を、○分○秒に簡単に変換できる

例えば、128秒は何分何秒かを求めたい場合、通常は次のような計算をします。

128 ÷ 60 = 2(分)
128 – 60 × 2 = 8(秒)

つまり、分を先に求めたあとで元の数値から、その分数を秒に直して引き算するという具合です。しかし、これも、剰余算を使えば簡単です。

128 % 60 = 8(秒)

となります。60で割り算をしたときの余りが秒となるわけです。

ある範囲を繰り返し、たどれる

例えば、日から土までの配列を準備したとします。

let weeks = ['日', '月', '火', '水', '木', '金', '土'];

これを繰り返し出力したい場合、剰余算を使えば簡単です。0から順に 7で割っていくと、その余りは次のようなパターンになります。

0 % 7 = 0
1 % 7 = 1
2 % 7 = 2

6 % 7 = 6
7 % 7 = 0
8 % 7 = 1

13 % 7 = 6
14 % 7 = 0

つまり、0から 6を繰り返し巡るのです。そのため、次のようにすれば曜日を繰り返し表示できます。

let weeks = ['日', '月', '火', '水', '木', '金', '土'];
for (let i=0; i<100; i++) {
  document.write(weeks[i%7]);
}

○回おきが簡単に実現できる

繰り返し構造と組み合わせた場合、例えば「交互に」背景の演出を変えたいなどが簡単にできます。「交互」というのは1回毎であるため、先のプログラムの応用で奇数の時と偶数の時で変えていけば良いのです。

for (let i=0; i<10; i++) {
  document.write(i%2 ? '■' : '○');
}

3以上の場合も同様です。3個おきは 3の剰余算、4個おきは 4の剰余算で求めることができます。例えば、カレンダーを出力するときのように7個おきに折り返したい場合は、次のようになります。

for (let i=0; i<30; i++) {
  document.write(i);
  document.write(i%7===6 ? '<br>' : '');
}

ぜひ、いろいろな場面で使っていきましょう。