/*
* 程序的版权和版本声明部分:
* Copyright (c) 2014,郑州大学SIAS国际学院
* 作 者: 王 杰
* 完成日期:2014 年 4 月 12 日
*
* 对任务及求解方法的描述部分:
* 输入描述: 略或见注释、总结
* 问题描述: 略或见注释、总结
* 程序输出: 略或见注释、总结
* 问题分析: 略或见注释、总结
* 算法设计: 略或见注释、总结
*/
#include<stdio.h>
int main()
{
int m,n,fac[9]={1},i; //阶乘:factorial
scanf("%d",&m);
while(m--){
scanf("%d",&n);
for(i=1;i<9;i++)
fac[i]=fac[i-1]*(i+1);
//for(i=0;i<9;i++)
//printf("%d ",fac[i]);
//从大往小贪,if为真就更新n,为假就跳过,找下一个合适值
//直到i=0,若n=0,yes,否则no
for(i=8;i>=0;i--)
if(n>=fac[i])
n-=fac[i];
if(n==0)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
运行结果:
总结:
1、fac数组只需开9个元素就行了(9!),因为题目n的值最大是100,0000 (而10!=362,8800),10!已经超过题目要求,没有必要计算那么大的;
2、贪心:从大往小,见注释;
3、int a[10]={0,1,2,6,24,120,720,5040,40320,362880}; 数组元素直接定义赋初值,减少运算
4、这道题感觉还可以用字典序(全排列)来做,就是把所有可能的结果做成一个表,然后在新表里匹配n,有就yes,没有就no,这种方法应该适合数据大,测试数据多的情况,对于本题来说,与想考察的知识点有点偏离,并且不太适用于本题。 不过这个不失为一个好方法。