Description
判断一个数是否能够被表示为多个数阶乘的和
Input
多组输入,每组一个非负数n(n<=1000000),以负数结束输入
Output
对于每组输入,判断其是否能被表示为多个阶乘的和,能则输出YES,不能则输出NO
Sample Input
9
-1
Sample Output
YES
Solution
因为1!+2!+3!<4!,这情况的成立,所以如果这个数能够表示成为多个数的阶乘,那么我们可以转换为这个数减去他能减掉的最大的阶乘的数是否能被表示,因为n最大为1000000,所以首先打个1~10的阶乘表
Code
#include<stdio.h>
int main()
{
int a[12],n;
a[0]=1;
for(int i=1;i<11;i++)//打表
a[i]=a[i-1]*i;
while(scanf("%d",&n)&&n>=0)
{
if(n==0)//0显然不满足条件
{
printf("NO\n");
continue;
}
for(int i=10;i>=0;i--)
if(n>=a[i])//能减就减
n-=a[i];
if(n==0) printf("YES\n");//满足条件
else printf("NO\n");//不满足条件
}
return 0;
}