2013-06-19 4 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] 
Смежные вопросы