1085:阶乘的和 分数: 2
时间限制:1 秒
内存限制:32 兆
特殊判题: 否
提交:13
解决: 2
题目描述
有些数可以表示成若干个不同阶乘的和。例如,9=1!+2!+3!。小明对这些数很感兴趣,所以他给你一个正整数n,想让你告诉他这个数是否可以表示成若干个不同阶乘的和。
输入格式
输入包含多组测试数据。每组输入为一个非负整数n(n<=1000000),当n为负数时,输入结束。
输出
对于每组输入,如果n可以表示成若干个不同阶乘的和,则输出YES,否则输出NO。
样例输入
9
-1
样例输出
YES
提示[+]
*** 提示已隐藏,点击上方 [+] 可显示 ***
提示[-]
这个题的关键在于所有数的阶乘的和都是由最靠近它的阶乘组成,如721,它的阶乘组成就有一个最靠近它的阶乘720,剩下再接着找,这个规律我也不知道为什么会出现,
求大神解释。
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int i,j,k;
int a[10]={1,1,2,6,24,120,720,5040,40320,362880};
int n;
while(scanf("%d",&n)!=EOF)
{
if(n<0)
break;
int flag=0;
if(n==0)
{
printf("NO\n");
}
else
{
for(i=9;i>=0;i--)
{
if(n>=a[i])
{
n=n-a[i];
//printf("%d %d\n",n,a[i]);
}
if(n==0)
{
flag=1;
break;
}
}
if(flag)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
}
return 0;
}