[英]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 = 999
和y = 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.