题目描述
输入一个整数N,判断其是否可以表示成一个正整数阶乘的形式或者几个不同正整数的阶乘之和。
输入要求
输入一个整数N。
输出要求
对应该整数N,若可以表示,输出YES,否则输出NO
输入样例
4
-1
0
6
^Z
输出样例
NO
NO
NO
YES
#include<stdio.h>
int main(){
int n,a[12],i,sum=1;
for(i=0;i<12;i++){
sum=sum*(i+1); //因为题目的单个整数阶乘的最大值到12!,即479001600。所以只计算到12!
a[i]=sum;
}
while(scanf("%d",&n)!=EOF){
if(n<=0){
printf("NO\n");
}
else if(n==1){
printf("YES\n"); //因为阶层和几个阶层之和除1外都是偶数,所以1要单独拿出来写
}
else{
for(i=11;i>=0;i--){
if(n>=a[i]){
n=n-a[i]; //逆向思维,求是否为和就求其差,如果能被数组里的不同数相减为0,则这是我们要找的数字
}
}
if(n==0){
printf("YES\n");
}
else{
printf("NO\n");
}
}
}
return 0;
}