题意:
给定一个数,问n能否由一些数的阶乘组成。
分析:
n<=1000000,还有时间限制2s。不是大数^_^. 11!=39916800.不会超出long范围 。一开始随手写了个,WA了好几次,感觉算法有点问题,去看了下poj关于此题的讨论。发现我是在实现的细节上出现问题了,算法本身对于这道题目来说没有错误。
> 不是数据规模小的问题,只是这里数据差别比较大,某数的值大于前面所以数的和,所以他的方法此处可行..应该从大到小去比较减去。
#include <stdio.h>
int main()
{
long fac(int m);
long n,sum;
int i,ff;
while(scanf("%d",&n)!=EOF)
{
sum=0;
ff=0;
if(n<0) break;
if(n==0) {printf("NO\n");continue;}
for(i=10;i>=0;i--)
{
if(n>=fac(i)) n-=fac(i);
if(n==0) {ff=1;break;}
}
if(ff==1) printf("YES\n");
else
printf("NO\n");
}
return 0;
}
long fac(int m)
{
long f=1;
int i;
for(i=1;i<=m;i++)
f*=i;
return f;
}