2016-03-24 19 views
3

問題は次のとおりです。Project Euler 34 Help [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

不思議な数字が有限です。 [Factorion:Upper Bound](https://en.wikipedia.org/wiki/Factorion#Upper_bound)を参照してください。 –

答えて

1

0!0と誤って計算しているため、階乗関数が正しくありません。

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

40730のコードを修正することができます。

PS:あなたの範囲内でのみ、他の好奇心の数はあなたがFUNCとVARに同じ名前を使用しないでください40585.

+0

ありがとうございます!だから、私は50000のような数字をチェックする必要がありますか? – RandomCoder

+0

または、彼は 'math.factorial()'を使用することができました。 – Reti43

+0

私はProject Eulerについて全く知らない。組み込みのメソッドを使用することは禁じられていますか?また、200,000を超える他の興味深い数字もあります。 – Selcuk

1

です。しかし、それは問題ではありませんでした。問題は、これはあなたが同じ階乗の和を6回計算することを意味階乗

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では、範囲()を使用することができます – qvpham

0

あなたのコードは145、154、415、451、514および541をチェックする関数でした。この繰り返しは、より多くの数字に進むにつれて増加します。一意の桁の組み合わせを計算し、合計にこれらの桁が任意の順序で含まれているかどうかをテストしてみてください。

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は常にループのネスト深度までソートされます。