非负整数

C++:阶乘之和

倖福魔咒の 提交于 2020-02-07 06:48:34
题目描述 给定一个非负整数n,请你判断n是否可以由一些非负整数的阶乘相加得到。 输入 有若干组数据。每行一个整数n,保证n<1000000。以负数结束输入。 输出 对于每组数据输出一行,若可以则输出‘YES’,否则输出‘NO’。 样例输入 9 -1 样例输出 YES 因为n<10^7,并且0!+1!+2!+3!+……+10!>10 ^7,那么我们可以定义一个a数组专门来装0到10的阶乘。笔者的在线题库中写的是“非负整数”,有些数据也要加上非负整数0!,否则就错了。因此考虑的时候,要从0开始考虑。0!=1。 我用了一个递归程序来完成,是一个bool型的递归函数。对于一个数据ans,加上a[i]后再递归枚举所有小于i的a[i],就可以找出所有的可能。 为了简洁时间复杂度,我首先找出了小于n的a[i],i最大的值,从i开始往小递归。 题目还要注意一点,是用复数结束输入的,避免输出超限要把输入放在while里面。 在找i的过程中,a[i]等于n就直接输出并continue吧。 不多废话,贴代码(Ctrl c+Ctrl v的朋友看这里): # include <bits/stdc++.h> using namespace std ; int p = 1 , i , n ; int a [ 11 ] = { 1 , 1 , 2 , 6 , 24 , 120 , 720 , 5040 ,