ABCD × 4 = DCBA
有名な算数のパズルです。
様々なサイトで紹介されていますが、今回は敢えて、それらを見ずに検討してみました。
まず論理的に解く場合について。
1000の位を4倍しても繰り上がらないということは、Aは1または2のいずれかです。3の場合、4×3=12で繰り上がってしまうから。
Dの4倍は偶数で確定ですから、A=2となります。
このように進めていくと程無く、ABCD=2178であることが分かります。
ではこれを、Excel のマクロで解く場合はどうでしょうか。お遊びで作ってみました。
Sub Sample() Dim i As Long For i = 1000 To 9999 If ReverseConfirmation(i, i * 4) = True Then MsgBox i Exit For End If Next End Sub Function ReverseConfirmation(Org As Long, Rev As Long) As Boolean Dim i As Long Dim iMax As Long Dim val As Long iMax = Len(CStr(Org)) For i = 1 To iMax val = val + Mid(Org, iMax - i + 1, 1) * (10 ^ (iMax - i)) Next If Rev = val Then ReverseConfirmation = True End If End Function
1000~9999まで順に、機械的に4倍して一致するか否かを確認しています。ここでポイントとなるのは、Aが1または2などということを、全く考慮していない点です。勿論考慮した方が計算の総数は減りますが、それらをコードに落とし込むのは中々困難です。もし処理時間に影響がないのであれば、今回のテーマに限らず、機械的に処理しても良いと思います。
また今回、1000~9999まで確認する繰り返し処理の部分と、4倍した値が反転した数値と一致するか否か確認する部分を分けてみました。
反転値の算出について、具体例で見てみましょう。
「2178」の場合、文字数は4文字なので、i = 1 to 4 で変化します。
i = 1 の場合、4-1+1 = 4 文字目(つまり 8)を、10 の 3乗(= 4 - 1)倍する ⇒ 8000
i = 2 の場合、4-2+1 = 3 文字目(つまり 7)を、10 の 2乗(= 4 - 2)倍する ⇒ 700
i = 3 の場合、4-3+1 = 2 文字目(つまり 1)を、10 の 1乗(= 4 - 3)倍する ⇒ 10
i = 4 の場合、4-4+1 = 1 文字目(つまり 2)を、10 の 0乗(= 4 - 4)倍する ⇒ 2
となって、これらを全て合計すれば「8712」となるわけです。
ところで今回、このマクロを作成して初めて知ったのですが、
1089 × 9 = 9801
も成立します。4 と 9 以外で該当する数値はありませんでした。
また、5,6,7桁のように増やしていくと、
21978 × 4 = 87912
10989 × 4 = 98901
219978 × 4 = 879912
109989 × 4 = 989901
2199978 × 4 = 8799912
1099989 × 4 = 9899901
のように、間に 9 が増えていくことも確認できました。恐らく全て既知の情報と思いますが、このような結果を自分で確認できるのも、なかなか面白いと思いました。
参考まで。