阶乘之和

/*  
* 程序的版权和版本声明部分:  
* 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,这种方法应该适合数据大,测试数据多的情况,对于本题来说,与想考察的知识点有点偏离,并且不太适用于本题。  不过这个不失为一个好方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值