Date: 2022/01/03

僕たちが法則に縛られた理由
-新年だから頭の体操-

システム開発をしている永松です。
年末のなんとなく活気がある町の雰囲気が好きです。

年末にかけて町が活気付き、大晦日にピークを迎え、元日に一気に静かになる。
この年末特有の町の動きが昔から好きで、なんとなく心躍る感覚があります。

そして三が日ゆっくりして、また日常が始まる。
始まるが、正月ボケが抜けない、そんな人も多いんじゃないでしょうか。

今回はそんな方々に向けて、1つ問題を出させてもらおうと思います。

また、合わせてその解答をプログラマとしてはどうする?といった観点でも紹介できればと思っています。

問題

今回取り上げる問題は以下となります。

ある2つの整数が与えられます。与えられた整数を乗算(掛け算)し、結果が偶数奇数かを判断してください。
なお、整数の範囲は0から10000までとします。

例えば
3と2の場合、3×2 = 6なので偶数
3と3の場合、3×3 = 9なので奇数
といった感じです。

解答方法は、どんな形でもいいのでこうやってやれば答えられるはず、というのを考えてもらえれば大丈夫です。

ちょっと数学の証明問題のようですが、チャレンジして欲しいのはどんな法則を使えば解答が導き出せるのか、が重要なので、自分ならどう答えるか、ぜひ一度考えてみてください。

この時点で興味が失せた人も多いと思います。
そんな方はそのまま読み進めるもよし、別の記事に行くもよしです。

解答1


この問題でまず説明できないといけないことは、「偶数と奇数の違い」です。
偶数は1桁目が「0,2,4,6,8」奇数は1桁目が「1,3,5,7,9」です。
ここで重要なのは「1桁目」で偶数、奇数が判断できるということです。つまり、123×685といった2桁以上の計算でも1桁目さえ見ればいいわけです。
上の式は答えが84255となり、1桁目は5なので奇数となります。

これを説明すると以下のようになるかと思います。

乗算(掛け算)した結果の1桁目を取り出し、「0,2,4,6,8」のどれかであれば偶数、「1,3,5,7,9」であれば奇数である。

思いっきり普通のことを言ってますが、まずはこれを理解し説明できるかというのは結構重要です。
今回の問題の解答としてはもちろんこれで正解なんですが、ちょっと力技感が否めません。
「0,2,4,6,8」というように、合計10種類のチェックをしちゃってるので、ここに何かしらの工夫ができそうです。

では、ここをどのように工夫するのか、それを次の解答で記載します。

解答2

「0,2,4,6,8」は偶数、「1,3,5,7,9」は奇数、これを10種類の数字を見るのではなく、もっと短く表現できないでしょうか。
これは割り算の「余り」を使うと簡単に表現できます。

ではどうするかというと数字を2で割り、余りが0なら偶数、1なら奇数です。
例えば3なら「3÷2=1あまり1」なので奇数、8なら「8÷2=4あまり0」なので偶数、となります。

これを使うと、以下の内容で解答することができます。

乗算(掛け算)した結果を2で割った余りが0なら偶数、1なら奇数である。

解答1に比べ説明がスッキリしたのではないでしょうか。

プログラマを目指してます、という人にこの問題を出せばほとんどの人はこの解答をします。
ただ、この解答をするのはどこかのサイトや本で「プログラムで偶数、奇数はこれで判断する」と書かれているのを覚えているだけで、ちゃんと理解できてる人って少ないかな、という印象があります。

さて、この問題についてはこの解答ができれば十分かなと思うのですが、
ここで終わっちゃうとちょっと面白くないので、ここからはさらに踏み込んだ法則を使い解答を紹介したいと思います。

解答3

2で割った余りで偶数、奇数が判断できることはわかりましたが、そもそももっと前に判断できないものでしょうか。
そこで、一度落ち着いて九九の表を見てみましょう。

この表から、答えが奇数になっているものを見てみましょう。

背景が黄色になっているのが結果が奇数となっている式です。
このように、掛ける数字が両方とも奇数の場合、答えも奇数という法則があります。
これに気がつくとこんな解答ができます。

与えられた数値が2つとも奇数であれば奇数、それ以外は偶数である。

そもそも掛け算をしなくて良くなったのでかなりスッキリした解答になりました。
ただ、いきなりこの答えを見せられても理解するのに時間がかかりそうなので、補足説明はあったほうがいいのかもしれません。

この解答で十分なんですが、せっかくプログラマが書いている記事なので、最後はプログラマっぽい解答を紹介したいと思います。

解答4

0から9までの数字を2進数で表現してみましょう。

この表から、1bit目が1であれば奇数、0であれば偶数であることがわかります。
これを使って解答3の解答をすると以下となります。

渡された数値の1bit目がどちらも1であれば奇数、それ以外は偶数である。

日本語としてみると解答3のほうがわかりやすいですが、プログラムで書こうと思うと解答4のほうがスッキリと書けます。

最後に

このように、何かの問題を解くときに何かしらの法則を見つけることができると回答方法も選択できる範囲が広がってきます。

このように、どこかクドくて面倒な感じがありますが、プログラマというのはずっとどこかで法則を探してるようなところがあります。

よくプログラマは数学が得意だと言われることが多いですが、個人的には「数学の法則が好きな人」が多い印象があります。
ただ、数学なんて難しいものではなく、小学校で習う算数でも、こういった法則があるなんて気にされることって少ないんじゃないでしょうか。

ふとした時に、こんなことを考えられる人、そういうことが好きな人はプログラマに向いてるのかもしれません。
そんな人は趣味ででもプログラムの本を読んでみて、実際にプログラムを書いてみると新しい世界が見えてくるかもしれません。



たまたま順番が新年にあたったので、新年らしいことをと思いましたが、慣れないことはしないほうがいいなと思いました。



最後になりましたが、新年あけましておめでとうございます。
本年もよろしくお願いいたします。

永松

この記事を書いた人

黙々とパソコンに向き合い、少々の無理難題にも粛々と応える、お悟りお開き系エンジニア。AND SPACEの様々なシステム案件を任されているだけでなく、会社全体の運営にも的を射た意見で常々存在感を発揮する。顧客や同僚にいくら駄々をこねられても、淡々と正論を繰り出す姿は、「ナガえもん」と呼ばれて然り。いかなるシステム案件も、最初は粗々で構わないと言い切れるのは、ユーザー目線の「実際の使用感」が大切なことを重々承知しているから。そこからの喧々諤々こそ真骨頂。皆々、度々、多々、救われる。