7

http://projecteuler.net/の問題 4には、次のように書かれています。

回文数はどちらの方法でも同じように読めます。2 つの 2 桁の数の積から作られる最大の回文は、9009 = 91 * 99 です。

2 つの 3 桁の数の積から作られる最大の回文を見つけます。

ここにこのコードがあります

def isPalindrome(num):
    return str(num) == str(num)[::-1]
def largest(bot, top):
    for x in range(top, bot, -1):
        for y in range(top,bot, -1):
            if isPalindrome(x*y):
                return x*y
print largest(100,999)

最大の回文を見つける必要があり、私が正しいと信じているものを吐き出し580085ますが、プロジェクトオイラーはそうは思いません。ここで何か問題がありますか?


for ループをよく考えたとき、私は最大の愚かな私をチェックするものを削除しました。作業コードはこちら

def isPalindrome(num):
    return str(num) == str(num)[::-1]
def largest(bot, top):
    z = 0
    for x in range(top, bot, -1):
        for y in range(top,bot, -1):
            if isPalindrome(x*y):
                if x*y > z:
                    z = x*y
    return z
print largest(100,999)

吐き出す 906609

4

14 に答える 14

9

逆に反復すると、最大の が見つかりません。x*y最大の回文が見つかりxます。580085 より大きい答えがあります。小さいxですが大きいyです。

于 2012-10-01T13:40:57.100 に答える
5

これは、より効率的に次のように記述されます。

from itertools import product

def is_palindrome(num):
    return str(num) == str(num)[::-1]

multiples = ( (a, b) for a, b in product(xrange(100,999), repeat=2) if is_palindrome(a*b) )
print max(multiples, key=lambda (a,b): a*b)
# (913, 993)

Python で Euler を実行しているitertools場合、ジェネレーターは非常に便利です。

于 2012-10-01T13:48:17.830 に答える
1

読みやすく保ちながら、より効率的にしようとしました:

def is_palindrome(num):
    return str(num) == str(num)[::-1]

def fn(n):
    max_palindrome = 1
    for x in range(n,1,-1):
        for y in range(n,x-1,-1):
            if is_palindrome(x*y) and x*y > max_palindrome:
                max_palindrome = x*y
            elif x * y < max_palindrome:
                break
    return max_palindrome

print fn(999)
于 2013-09-26T08:31:59.677 に答える
0

単純:

def is_pallindrome(n):
    s = str(n)
    for n in xrange(1, len(s)/2 + 1):
        if s[n-1] != s[-n]:
            return False    
    return True

largest = 0
for j in xrange(100, 1000):
    for k in xrange(j, 1000):
        if is_pallindrome(j*k):
            if (j*k) > largest: largest = j*k
print largest
于 2015-03-01T03:30:41.643 に答える
0

580085 = 995 X 583、ここで 906609 = 993 X 913。上から下にブルート フォースを適用するだけで見つかりました。

于 2017-10-28T17:41:21.827 に答える
-1

ReThink: 効率とパフォーマンス

def palindrome(n):    

    maxNumberWithNDigits = int('9' * n) #find the max number with n digits

    product = maxNumberWithNDigits * maxNumberWithNDigits 

    #Since we are looking the max, stop on the first match

    while True:        
        if str(product) == str(product)[::-1]: break;

        product-=1

    return product

start=time.time()
palindrome(3)
end=time.time()-start

回文...: 997799, 0.000138998031616 秒

于 2014-04-26T20:58:43.890 に答える