ABCD × 4 = DCBA

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 が増えていくことも確認できました。恐らく全て既知の情報と思いますが、このような結果を自分で確認できるのも、なかなか面白いと思いました。

参考まで。