有些数能若干个数的阶乘之和。例如,数字9,9=1!+2!+3!。给定一个数n(n<=1,000,000),判断它是否能表示成若干个数的阶乘之和。注意,这些数不一定是连续的,也不一定从1开始。

    输入描述
    输入数据有多组,每组占一行,由一个整数组成,直到输入-1结束。

    输出描述
    对于每组输入数据,输出一行。如果能表示成阶乘之和,输出“YES”,否则输出“NO”。

    输入样例
    0 1 2 9 10 12 24 5040 -1

    输出样例
    NO YES YES YES YES NO YES YES

    1. import math
    2. from itertools import combinations
    3. def fact(num):
    4. ls = [math.factorial(x) for x in range(num)]
    5. return ls
    6. def fact_test(num, fact_ls):
    7. if num == 0:
    8. return False
    9. for i in range(num+1):
    10. for num_i in combinations(fact_ls, i):
    11. if num == sum(num_i):
    12. print(f'{num} =', '! + '.join(map(str, num_i))+'!')
    13. return True
    14. else:
    15. return False
    16. if __name__ == '__main__':
    17. while True:
    18. n = int(input())
    19. if n < 0:
    20. break
    21. fact_lst = fact(n)
    22. print(fact_test(n, fact_lst))