Pythonで回文数をさがそう

今回の問題

前から読んでも後ろから読んでも同じである数を回文数といいます。では、2つの3けたの数をかけてできる数のなかで、一番大きい回文数はなんでしょう。

例:12145549009 など。 これらは、逆から読んでも同じ数字になります。

「3けたの数(100〜999)」を2つかけ算して、その答えが「回文数」になるもののうち、一番大きな数字を見つけましょう。


段階1:かけ算を全部やってみる

まずは、100から999までの数を、ぜんぶ組み合わせてかけ算します。

ポイント

  • くり返しはforを使います。
  • 2つの数字をすべての組み合わせでかけ算したいので、forの中でforを使います。
# まずは104まででためしてみよう
for i in range(100, 105):
    for j in range(100, 105):
        kotae = i * j
        print(i, "×", j, "=", kotae)

段階2:ぎゃくから読んでも同じかくらべる

かけ算の答えが、「回文数」かどうかを調べます。

ポイント

  • 数字を「文字」に変える: 数字のままだとさかさまにしにくいので、一度「文字」としてあつかいます。
  • さかさまにする: 右から読んでも同じか、くらべます。
kazu = 12321
# 数字を「文字」にへんかん
moji = str(kazu)
# さかさまにした文字を作る
sakasama = moji[::-1]

if moji == sakasama:
    print(kazu, "は、ぎゃくから読んでも同じ")
else:
    print(kazu, "は、ちがう。")

段階3:一番大きい数字をおぼえる

回文数はたくさん見つかります。その中で「一番大きいもの」だけをメモしておきます。

ポイント

  • 「一番」をいれる箱: saidai(最大)という名前の箱を用意します。
  • 大きさをくらべる: 新しく見つけた回文数が、今の箱の中身より大きかったら、中身を入れかえます。
saidai = 0 # 最初は0を入れておく

for i in range(100, 1000):
    for j in range(100, 1000):
        kotae = i * j
        s = str(kotae)
        
        # もし逆から読んでも同じなら
        if s == s[::-1]:
            # もし、今まで見つけた中で一番大きかったら
            if kotae > saidai:
                saidai = kotae # 箱の中身を書きかえる

print("一番大きい回文数は", saidai, "でした!")

すこしむずかしい問題

このプログラムは少しむだがあります。むだをなくしましょう。

数字をぎゃくにするときに、文字におきかえないで数字のまま計算でぎゃくにする方法を考えましょう。