偶数・奇数の判定の仕方
なぜか「偶数 奇数」という検索ワードが目についたので、もしかして偶数/奇数の判定の仕方がわからない人が情報を求めてやってきたかもしれないので書きます。
(主に小中学生を想定します。)
自分も小学生くらいにBASICを覚えたことですけど、その時は「そんなやり方でできるのか!」とちょっと感動しました。
その時に覚えたやり方も後で書いておきます。
その前にちょっとだけ問題です。
[問題1]
1.5は偶数ですか奇数ですか?
また、2.5は偶数ですか奇数ですか?
[答え1]
偶数でも奇数でもない。
偶数か奇数か、というのは整数の時だけ成り立ちます。
小数などにはそういう決まりはありません。なので偶数とも奇数ともいえないのです。
[問題2]
-1は偶数ですか奇数ですか?
[答え2]
-1は奇数。
また、-2は偶数、-3は奇数、以下同様です。
このような問題を出したのは、何を奇数や偶数と決めるかをはっきりさせたかったからです。
では偶数と奇数は以下のように決めましょう。
偶数は「2で割り切れる整数」、奇数は「2で割り切れない整数」。
この決まりからすると、0も偶数となります。
では具体的に判定する方法を書いていきましょう。
判別したい数字がX%に入っているものとします。
(1) MODを使う方法
MODというのは、割り算の余りを求めるものです。
5を2で割った余りを求めたい時、 5 MOD 2 のように書きます。
これが先ほど「2で割り切れる整数」という表現に最も近い書き方です。
IF (X% MOD 2)==0 THEN PRINT "グウスウ" ELSE PRINT "キスウ" ENDIF
ただしMODを使う場合、注意があります。
マイナスの数に対して使うとマイナスの数を返すのです。
例えば、-1 MOD 2 の答えは -1 になります。
だから奇数かどうかを調べたいからといって、
IF (X% MOD 2) == 1 THEN '奇数かどうか調べたい(ダメ)
のように書いてしまうと思ったとおりの結果になりません。
IF (X% MOD 2) != 0 THEN '奇数かどうか調べたい (よい)
のように書きましょう。
(2) ANDを使う方法
ANDは論理積というものです。
まずはプログラムを見てみましょう。
IF (X% AND 1) == 0 THEN PRINT "グウスウ" ELSE PRINT "キスウ" ENDIF
ANDは2進数で考えます。
例えば5は2進数で 101 です。1は 2進数でも 1です。
ANDは2進数の時のそれぞれの桁同士のかけ算と考えればわかりやすいです。
1の方は桁が足りないので頭に0を補って、 001 と考えます。
5=101
1=001
なので、
答え001
です。
4=100なので、 4 AND 1は 0 です。
このように、X% AND 1 のように書くと、X%を2進数で表した時の一番下の桁が 1 かどうかを調べることができます。
実は偶数は2進数で表すと一番下の桁は 0 、奇数は2進数で表すと一番下の桁は 1 になります。
従って最初に書いたやり方で偶数と奇数を判定することができるのです。
ところでマイナスの数の場合はどうでしょうか。
実はマイナスの数の場合でも同じです。
例えば、-1 は2進数で表すと(プチコンでは)、1が32桁分続いた数字になります。でも一番下の桁はやはり 1 です。
マイナスの数の場合でも同じように判定できるのです。
(3) FLOOR関数を使う方法
これが私が最初に覚えたやり方に一番近い方法です。
具体的には次のように書きます。
IF (X%/2) == FLOOR(X%/2) THEN PRINT "グウスウ" ELSE PRINT "キスウ" ENDIF
これは何をやっているのでしょう?
FLOOR関数は、数値の整数部分を取り出す、というものです。
具体的な例で考えてみましょう。
例えばX%は 5 とします。
5/2は2.5です。 FLOOR(5/2)は、2.5の整数部分を取り出すから 2 になります。
2.5と2を比較すると違うので、奇数と判定されます。
今度はX%を 4 とします。
4/2は2です。FLOOR(4/2)は2です。
2と2を比較すると同じなので、偶数と判定されます。
つまり、2で割り切れない時の余りの1の部分が、それを2で割った0.5として現れてくるのです。
だから奇数の時は、FLOORをとらない時とFLOORをとった時で結果が変わってくるのです。
ちなみにマイナスの数の時でも、同じ式で問題ありません。
さて、3つ方法を見ましたが、どれを使うのがよいでしょうか?
(1)の方法が、「2で割り切れない」のが奇数、という最初に書いた決まりを一番わかりやすく表しているので、これを使うのがまずはよいでしょう。
プログラムに慣れてきたら(2)の方法でもよいかもしれません。
(3)の方法はそんなにおすすめできません。ですが、別のことに応用できます。(次の記事にしますので興味があったら見てください。)