2016-03-24 2 views
3

Проблема в следующем:Project Euler 34 Помощь [Python]

145 Любопытный номер, как 1! + 4! + 5! = 1 + 24 + 120 = 145.

Найдите сумму всех чисел, которые равны сумме факториала их цифр.

Примечание: как 1! = 1 и 2! = 2 не являются суммами, которые они не включены.

# Project Euler Problem 34 
def factorial(num): 
    """Factorial""" 
    product = num 
    for i in range(2, num): 
     product *= i 
    return product 

def check_sum(number): 
    list_digits = list(str(number)) 
    check_sum = 0 
    for digit in list_digits: 
     check_sum += factorial(int(digit)) 
    if check_sum == number: 
     return True 

def find_final_sum(): 
    """Find the sum of all the numbers.""" 
    final_list = [] 
    final_sum = 0 
    counter = 3 
    while counter < 200000: 
     if check_sum(counter): 
      final_list.append(counter) 
      counter += 1 
     else: 
      counter += 1 

    for j in final_list: 
     final_sum += j 
    print(final_sum) 

find_final_sum() 

Я определил функцию для поиска факториалов. Затем я определил функцию, чтобы проверить, равна ли число суммам факториалов его цифр. Наконец, я проверяю числа от 3 до 200000. Если число работает, я помещаю его в список. В конце я подведу список и распечатаю его.

Этот код дает мне только 145 ответов. Я не вижу, что я делаю неправильно, может ли кто-нибудь помочь?

Я не пытаюсь опубликовать решение проблемы Эйлера.

+0

У вас есть переменная и функция с тем же именем (final_sum) –

+0

Я изменю это. – RandomCoder

+0

Есть конечное количество любопытных чисел. См. [Фактор: Верхняя граница] (https://en.wikipedia.org/wiki/Factorion#Upper_bound) –

ответ

1

Ваша факториальная функция неверна, поскольку она ошибочно вычисляет 0! как 0. Вы можете исправить это следующим образом:

def factorial(num): 
    """Factorial""" 
    if num < 2: 
     return 1 
    ... 

, то ваш код будет печатать 40730.

PS: Единственный любопытный номер в вашем диапазоне является 40585.

+0

Большое спасибо! Так что мне нужно только проверять номера до 50000? – RandomCoder

+0

Или он мог бы использовать 'math.factorial()'. – Reti43

+0

Я вообще не знаю о Project Euler; Вам запрещено использовать встроенные методы? Кроме того, могут быть другие любопытные номера за пределами 200 000. – Selcuk

1

Вы не должны использовать то же имя для FUNC и вар. Но это не проблема. Проблема была функция факториала

import math 

def check_sum(number): 
    list_digits = list(str(number)) 
    check_sum = sum([math.factorial(int(digit)) for digit in list_digits]) 
    return check_sum == number 

def final_sum(counter_min=3, counter_max=200000): 
    """Find the sum of all the numbers.""" 
    final_sum = 0 
    for counter in xrange(counter_min, counter_max): 
     if check_sum(counter): 
      final_sum += counter 
    return final_sum 

if __name__ == '__main__': 
    print(final_sum()) 
+0

Да. Я просто попробовал это с помощью math.factorial(). Моя исходная факториальная функция не могла вычислить 0! правильно. – RandomCoder

+0

Является ли xrange() функцией python2? Я использую python3 – RandomCoder

+0

У Python3 нет xrange(). В python3 вы можете использовать range() – qvpham

0

Ваш код проверяет 145, 154, 415, 451, 514 и 541. Это означает, что вы вычислить ту же сумму Факториал 6 раз. Это повторение увеличивается, когда вы переходите к большему количеству цифр. Попробуйте просто вычислить уникальные комбинации цифр и проверить, содержит ли сумма эти цифры в любом порядке.

import math 
def compare_digits(val, arr, nesting_depth): 
    digits = [int(d) for d in str(val)] 
    digits.sort() 
    return arr[0:sz] == digits 

f = [math.factorial(i) for i in range(10)] 
idx = [ 0,0,0,0,0,0,0 ] 
for idx[0] in range(10): 
    for idx[1] in range(idx[0], 10): 
    sum = f[idx[0]] + f[idx[1]] 
    if compare_digits(sum, idx, 2): 
     total += sum 
    for idx[2] in range(idx[1], 10): 
     sum = f[idx[0]] + f[idx[1]] + f[idx[2]] 
     if compare_digits(sum, idx, 3): 
     total += sum 
     # for idx[3] etc. 

Обратите внимание, что массив idx всегда сортируется до глубины вложенности петли.