此快捷鍵時,它是不可能返回i * j>記錄最大並正確返回906609(注意,如果你使用python 2,下面的代碼對你有用,但是你更願意使用xrange
而不是range
來避免在內存中創建不必要的列表):
def palindrome(floor=0, upto=999):
'''
return the largest palindrome product for all number from (but not including)
floor to (and including) upto
'''
start = upto
largest = None
for i in range(start, floor, -1): # decreasing from upto
if i * upto < largest: # if True, impossible for higher product from combo
break
for j in range(start, i-1, -1): # decrease from upto to not including i-1
product = i*j
if str(product) == str(product)[::-1]:
if product > largest:
largest = product
return largest
用法:
>>> palindrome(99,999)
906609
>>> palindrome(10,13)
121
>>> palindrome(0,10)
9
短切削性是重要,因爲如果給出一個非常大的數字,它可能需要一段時間來恢復:
>>> palindrome(upto=100000000)
9999000000009999L
我還創建了一個發電機擊中從0到999的每一個組合,並返回906609.
def palindrome(upto=1000):
return max(i*j for i in range(upto) for j in range(upto)
if str(i*j) == str(i*j)[::-1])
但運行此迴文時爲:
>>> palindrome(upto=100000000)
完整的搜索將搜索所有億^ 2,走的時間太長了。
我第一次寫了它這樣的,這個想法,這將短切和避免循環訪問每一個可能的組合,但是這是不正確,則返回888888:
def palindrome():
start = 999
largest = 0
for i in range(start, 0, -1): # decreasing from 999
if i * 999 < largest:
return largest
for j in range(start, i, -1): # decreasing from 999 to i
if str(i*j) == str(i*j)[::-1]:
largest = i*j
它先乘999次999,然後998次999,然後
998*998
997*999
997*998
997*997
...
但結果並不單調遞減(即,每一個結果是不能保證是比以前的小。)
如果您使用像PyCharm這樣的工具,它將使調試這樣的工具變得更容易。 – Ron