所以,我這說的Project Euler 145工作:項目歐拉較小的情況下沒有得到預期的結果145
一些積極的整數n有總和
[ n + reverse(n) ]
完全由奇(十進制)的數字財產。例如,36 + 63 = 99
和409 + 904 = 1313
。我們會稱這些數字是可逆的;所以36,63,409和904是可逆的。在n或reverse(n)中不允許出現前零。有一千個以下的120個可逆數字。
在10億(10 ** 9)以下有多少個可逆數字?
我想下面的代碼(而不是使用10^9我使用10到檢查結果(這應該是零)正在發生的事情:
def check(x):
y = int(str(x)[::-1]) #x backwards
#add the rev number to the original number (convert them to a list)
xy = list(str(x+y))
#a list of even digits.
evens = ['0', '2', '4', '6', '8']
#check if the number has any digits using intersection method.
intersect = set(xy).intersection(set(evens))
if not intersect:
#if there was no intersection the digits must be all odd.
return True
return False
def firstCheck(x):
if (int(str(x)[:1])+(x%10))%2 == 0:
#See if first number and last number of x make an even number.
return False
return True
def solve():
L = range(1, 10) #Make a list of 10
for x in L:
if firstCheck(x) == False:
#This quickly gets rid of some elements, not all, but some.
L.remove(x)
for x in L:
if check(x) == False:
#This should get rid of all the elements.
L.remove(x)
#what is remaining should be the number of "reversible" numbers.
#So return the length of the list.
return len(L)
print solve()
它的工作原理兩個部分:在方法solve
有一個firstCheck
和check
第一個檢查是快速消除一些數字(所以當我做一個10^9大小的列表,我可以釋放一些RAM)。第二個檢查是擺脫所有的數字可能不是「可逆數字」在第一個檢查中,我只看到第一個和最後一個數字是否爲偶數,然後消除該數字。檢查方法我反轉數字,將這兩個數字加在一起並將它們放入一個列表中,然後檢查它是否與evens列表相交,如果它從列表中消除。結果列表應該是「可逆」數字元素的數量,因此我將該列表並返回其長度。對於range(1,10)
我得到2作爲結果(而不是所需的零)。而它沒有消除的數字[4,8],我似乎無法找出原因。
注:1。您可以通過*計數*而不是管理列表來避免任何空間問題,這也更快。 2.這種方法很慢,並且不能很好地擴展,通過分析條件可以得到一個即時返回答案的解決方案,即使在10^20的範圍內也是如此。 – 2012-02-01 12:00:43