2

私は再びプロジェクトオイラーに取り組んでいます。今回は問題#4です。このスクリプトのポイントは、2つの3桁の数字の最大の回文積を見つけることです。解くのはかなり簡単だと思いましたが、答えが低すぎます。より具体的には、私は580085を取得しており、答えは906609です。

誰かがこれが間違っていることについて教えてもらえますか?

#!/usr/bin/env python
# encoding: utf-8
"""
P4.py

Created by Andrew Levenson on 2010-06-29.
Copyright (c) 2010 __MyCompanyName__. All rights reserved.
"""

import sys
import os


def main():
    for x in range(100, 1000):
        for y in range(100, 1000):
            z = str( x * y )
            s = str( z[::-1] ) # Reverse z
            if z == s:
                t = z
    print t


if __name__ == '__main__':
    main()
4

6 に答える 6

6

後でそれを置き換える小さな製品がある可能性があるため、コードは最大の製品を印刷することを確認しません。これを修正するには、tゼロに初期化し、条件を次のように置き換えます。

if z==s and int(z)>t:
    t = int(z)

または同等に、

if z==s:
    t = max(t,int(z))

編集:上記のint/stringの問題を修正しました。ただし、次のように文字列への変換を回避してintに戻す方が少しクリーンです。

def isPalindrome(x):
    s = str(x)
    return s == s[::-1]

t = 0
for x in range(100, 1000):
    for y in range(100, 1000):
        z = x * y
        if isPalindrome(z) and z > t:
            t = z
print t
于 2010-06-30T01:30:04.040 に答える
6

これは、単一の式でそれを行うためのトリッキーですが正しい方法です...:

def main():
  print max(p for x in range(100, 1000) for y in range(x, 1000)
              for p in (x * y,) if str(p) == str(p)[::-1])

トリッキーな部分はfor p、割り当ての役割を果たす単一アイテム句です(その製品の再計算を数回停止するだけです;-)。

受け入れられた答えは間違っていることに注意してください(他のいくつかのように)、 int maxとは異なる文字列"max"を探すため、実行してみてください。そうすればわかります!-)

于 2010-06-30T02:13:17.140 に答える
3

問題は、最大の回文を見つけることです。ここには、最大のもの、単に最後のものを見つけるものは何もありません。最後のものが最大になると想定しましたが、ZxZの可能性の二乗全体を調べているため、そうではありません。

たとえば、101 * 999を検討した後、200*101を検討しています。

于 2010-06-30T01:30:39.243 に答える
2

2つのforループを使用しているため、最大の積ではなく、最大のx値を持つ数値を取得します。

906609 = 993 * 913

その後、xは増加し続け、次の回文は次のようになります。

580085 = 995 * 583

見つけた最大の回文を追跡するには、変数が必要です。

def main():
    largest = 0
    for x in range(100, 1000):
        for y in range(100, 1000):
            z = str( x * y )
            s = str( z[::-1] ) # Reverse z
            if z == s:
                t = int(z)
                if t > largest:
                    largest = t
    print largest
于 2010-06-30T01:44:29.757 に答える
1

あなたが見つけたものがあなたがすでに持っているものよりも大きいかどうかチェックを追加する必要があります。

于 2010-06-30T01:34:56.380 に答える
0

このテストで時間を節約できることを付け加えておきます。6桁のパリンドロームはすべて11で割り切れる必要があります。したがって、少なくとも1つの要素は11で割り切れる必要があります。

于 2010-07-02T14:56:15.993 に答える