簡體   English   中英

歐拉計划-最大回文#4 Python

[英]Project Euler - Largest Palindrome #4 Python

我是python新手,因此決定通過對Euler項目進行一些挑戰來提高我的編碼(總體而言)是一個好主意。 我目前停留在問題4上,我不確定出了什么問題(對於那些不知道的人,問題4如下):

回文數在兩個方向上都相同。

由兩個兩位數的乘積組成的最大回文數為9009 = 91 x 99。

查找由兩個3位數字的乘積組成的最大回文。

x, y = 999, 999
palindrome = []
while True:
    palindrome = [i for i in str(x * y)]
    r_palindrome = palindrome[::-1]
    if palindrome == r_palindrome:
        break
    else:
        y -= 1
        if y < 100: 
            y = x
            x -= 1
print x, y, palindrome

我似乎得到的答案是987 * 286 = 282282 ,感覺很低。 有人可以解釋這樣做的最佳方法以及我當前的代碼在做什么錯,而不是簡單的“代碼在這里”答案。

x = 999y = 999 ,然后僅遞減y直到重新遞減x並重置y並不能保證您首先遇到最大的回文。

試想一下以下示例:讓我們想象一下產品的其他要求(此處不要破壞回文結果)。 假設您從x = 999開始,然后達到y = 101直到您獲得第一個“有效”結果。

在您的情況下,您將接受999 * 101 = 100899作為最大結果。 但是實際上可能存在另一種解決方案998 * 998 = 996004 ,您從未看過它,但是顯然更大。

因此,您需要更改決定何時停止觀看並知道自己已達到最大數量的方式。


順便說一句。 作為對歐拉計划的一般提示:特別是第一個問題可以很容易地用蠻力解決(即嘗試所有可能的解決方案)。 盡管這可能不會給您令人滿意的感覺,即您以巧妙的方式解決了問題,但確實為您提供了解決方法的想法。 您總是可以找到一個更好的解決方案,但是請記住,歐拉計畫實際上存在很多問題,無論如何都無法使用蠻力解決,因此您以后就不必擔心;)

對於這個特定的問題,您可以編寫一個列表理解,該列表可以讓您獲得所有回文,然后獲得最大的回文。 那是單線的; 它的效率很低,但是對於這個特別小的輸入域,它的速度足夠快,仍然可以立即為您提供答案:

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

好的,只是找到解決方案,讓我們使用蠻力:

>>> prod = itertools.product(range(999,99,-1),range(999,99,-1))
>>> palindromes = [(x*y,x,y) for x,y in prod  if str(x*y) == str(x*y)[::-1]]
>>> max(palindromes, key=lambda t: t[0])
(906609, 993, 913)

花了一些時間,但至少我們有答案。 我已經設計出一種解決方案,該解決方案可以非常快速地工作,並且我認為這需要您要實現的目標的本質:

>>> x = 999
>>> palindromes = []
>>> floor = 99
>>> while x > floor:
...     for i in range(x,floor,-1):
...         product = x*i
...         candidate = str(product)
...         if candidate == candidate[::-1]:
...             palindromes.append((product,x,i))
...             floor = i
...             break
...     x -= 1
... 
>>> palindromes
[(580085, 995, 583), (906609, 993, 913), (886688, 968, 916), (888888, 962, 924)]
>>> 

從本質上講,這以最低的數量更新了地板,最后使我們回文了。 我們知道我們不必每次看起來都比這更低。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM