NYOJ-91:阶乘之和

来源:互联网 发布:上膛雾化器做丝数据 编辑:程序博客网 时间:2024/04/27 18:32
描述

给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No;

输入
第一行有一个整数0<m<100,表示有m组测试数据;
每组测试数据有一个正整数n<1000000;
输出
如果符合条件,输出Yes,否则输出No;
样例输入
2
9
10
样例输出
Yes
No
#include<iostream>#include<cstdio>#include<cstring>#define N 14using namespace std;/*贪心算法,从小于n的最高阶乘减起*/long fac[N];void Cal(){int i;fac[1] = 1;for(i=2;i<N;i++)fac[i] = i*fac[i-1];}int main(){int t,n;Cal();//先计算出阶乘表cin>>t;while(t--){cin>>n;int i=1;while(fac[i]<n)i++; //找到第一个比n大的阶乘while(i>0){if(n>=fac[i])n = n-fac[i];//当n大于该阶乘时减去该阶乘i--;}if (n>0)//如果余数不为0则不是cout<<"No"<<endl;else cout<<"Yes"<<endl;}return 0;}