3

I've tried to create a program that checks each number to see if it is equal to the sum of the factorials of its individual digits. For some reason that eludes me, it fails to add any values to the list, and if I were to print the summed variable after each instance, it would display summed as equal to 0. Can anyone help?

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)
4

5 回答 5

2

没关系,我注意到我未能在每个实例结束时重置 y 值。

y = 0

这就是全部。

于 2013-06-19T00:30:32.613 回答
2

你需要y = 0在你的while循环中设置

于 2013-06-19T00:30:41.067 回答
2

循环字符串的更好方法是这样的:

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

在最终名单上:

for item in listed:
    summed += item

那你根本不需要y

于 2013-06-19T00:37:11.163 回答
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]
于 2013-06-19T00:57:02.997 回答
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)
于 2013-06-19T00:37:41.047 回答