banana2564
@banana2564

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

python 回文積

解決したいこと

以下のコードでは結果が0になってしまいます。
まだ初心者なので教えていただきたいです。

import math

max_num = 100
answer = 0
for i in reversed(range(max_num)):
for j in reversed(range(max_num)):
num = i*j
num2 = num
while num2 > 0:
remain = num2 % 10
num2 //= 10
answer = answer * 10 + remain
if answer == num and num > 0:
break
else:
continue
if answer == num:
break

print(str(num))

左右どちらから読んでも同じ数字になる最大のものを二桁の数字の積から見つけるものです。99からループで回せば最初に見つかったものが最大だと考えループを逆にしました。誰かお願いします。

0

1Answer

まず、以下の記事などを参考に、投稿前にプレビューでコードが綺麗に表示されることを確認されるとよいです。
特にPythonはインデントが重要なので、回答者は元の構造を想像で復元しなくてはなりません。

して、復元したものがこちらです。
修正案も一緒に示しています。

  import math
  
- answer = 0
  max_num = 100
  for i in reversed(range(max_num)):
      for j in reversed(range(max_num)):
+         answer = 0
          num = i * j
          num2 = num
          while num2 > 0:
              remain = num2 % 10
              num2 //= 10
              answer = answer * 10 + remain
          if answer == num and num > 0:
              break
          else:
              continue
      if answer == num:
          break
  
  print(str(num))

元のコードを実行すると、確かに0が表示されます。
answerを初期化していないので、answer == numが満たされることがないためです。

answer = 0の位置を変えると、正解の9009(= 99 * 91)が一応表示されます。

しかしながら、

99からループで回せば最初に見つかったものが最大だと考えループを逆にしました。

この方針がうまくいったのはたまたまです。
この構造の2重ループだと、99 * 99, 99 * 98, ..., 99 * 0, 98 * 99, ...という順序で組み合わせが試されるため、最初に見つかったものが積として最大になる保証はありません。
その点に配慮すると、最大値を保持しておくのが最も簡単でしょうか。

他にも改善できるところは無数にあるんですが、ひとまずこれにて。

1Like

Comments

  1. @banana2564

    Questioner

    回答ありがとうございます。
    参考にして頑張ってみます。

Your answer might help someone💌