2013-06-19 25 views
3

的總和。出於某種原因,那逃避我,它沒有任何價值添加到列表中,如果我是打印每個實例後的總結變量,它會顯示總結爲等於0。誰能幫助?Python的 - 我試圖創建一個程序,它會檢查每個號碼,看它是否等於它的個別數字的階乘的總和階乘

import math 

x = 2 
y = 0 
summed = 0 
listed = [] 

while x < 10000000: 
     x += 1 
     summed = 0 
     xString = str(x) 
     xLength = len(xString) 
     while y < xLength: 
       summed += math.factorial(int(xString[y])) 
       y += 1 
     if (x == summed): 
       listed.append(x) 

y = 0 
summed = 0 

listLength = len(listed) 

while y < listLength: 
     summed += listed[y] 
     y += 1 

print(listed) 
print(summed) 

回答

2

您需要一種更好的方式通過字符串設定y = 0 while循環

+0

是的,我看到,只要我發佈這個該死的東西,謝謝!^_^ – Doomlar

2

沒關係,我注意到我沒有在每個實例結束時重置y值。

y = 0 

這就是它所需要的。

+0

答案不僅僅是爲了您的利益,而是爲了其他許多人的利益。你應該會看到多個答案的一個問題。 – dansalmo

2

內循環是這樣的:

xString = str(x) 
for c in xString: 
    summed += math.factorial(int(c)) 

,並通過最後的名單:

for item in listed: 
    summed += item 

然後你不需要y可言。

+0

啊,這真的很有幫助,謝謝! – Doomlar

1

一定程度的簡化版本:

import math 

listed = [] 
for x in xrange(2, 10000000): 
    summed = sum(math.factorial(int(d)) for d in str(x)) 
    if (x == summed): listed.append(x) 
summed = sum(y for y in listed) 

print(listed) 
print(summed) 

和一些速度更快的版本:

import math 

facts = dict() 
def ffact(sn): 
    if len(sn) == 1: return math.factorial(int(sn)) 
    if sn not in facts: 
     facts[sn] = ffact(sn[0]) 
     if len(sn) > 1: facts[sn] += ffact(sn[1:]) 
    return facts[sn] 

listed = list() 
for x in xrange(2, 1000000): 
    if ffact(str(x)) == x: listed.append(x) 
summed = sum(y for y in listed) 

print(listed) 
print(summed) 
1

(這不會發布到一個答案,而是因爲它很難格式化代碼註釋。)

from math import factorial as fact 

def digits(n): 
    return [int(d) for d in str(n)] 

def isSumOfOwnDigitsFactorialed(n): 
    return n==sum(fact(d) for d in digits(n)) 

演示:

>>> digits(152) 
[1, 5, 2] 

>>> [i for i in range(10**6) if isSumOfOwnDigitsFactorialed(i)] 
[1, 2, 145, 40585]