この問題では、十六進表記された数における倍数判定を考える必要があります。
十六進表記された整数 X において、以下のことが成り立ちます。
- X の下 1 桁が 2 で割り切れるなら、X は 2 で割り切れる。(①)
- X の各桁の和が 5 で割り切れるなら、X は 5 で割り切れる。(②)
これら 2 つを同時に満たすとき、 X は 10 で割り切れます。
以下は①、②の証明です。
X を M 桁として、上からi桁目の数字(文字)を Xiとして説明します。
X は以下のように表せます。
X = 16M−1X1 + 16M−2X2 + ... + 162XM−2 + 16XM−1 + XM
<①について>
X を下一桁とそれ以外で分けて考えます。
X = 16 (16M−2X1 + 16M−3X2 + ... + 16XM−2 + XM−1) + XM
すると、X が 2 で割り切れることと XM が 2 で割り切れることは同値であることが分かります。
<②について>
X を以下のように、各桁の和とそれ以外に分けて考えます。
X = (16M−1−1)X1 + (16M−2−1)X2 + ... + (162−1)XM−2 + (16−1)XM−1 + (X1+X2+...+XM−2+XM−1+XM)
(X1+X2+...+XM−2+XM−1+XM) は各桁の和を表しています。
ここで、16i−1 (1≤i) は 5 で割り切れるため、上の式の左側はすべて 5 で割り切れます。
すると、X が 5 で割り切れることと (X1+X2+...+XM−2+XM−1+XM) が 5 で割り切れることは同値であることが分かります。
これは 十進表記における、3 の倍数の各桁の和が 3 の倍数であることに似ています。
解答例(C++)
<追加問題>
十六進表記された整数 X が 17 の倍数であるかどうかを判定してください。