描述
给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No;
输入
第一行有一个整数0<m<100,表示有m组测试数据;
每组测试数据有一个正整数n<1000000;
输出
如果符合条件,输出Yes,否则输出No;
样例输入
2 9 10
样例输出
Yes No
思路
因为10的阶乘就已经超出所给的范围了,所以就在1-9阶乘里判断就可以了。
1-9的阶乘1 2 6 24 120 720 5040 40320 362880。
由于每个阶乘之间的差值都很大,以至于前面阶乘的累加和都不会超过后面的阶乘,所以就可以放心选择与目标数最接近的阶乘减掉,再使目标数为减掉后的差值以此类推,直到减到1的阶乘或者目标数为0,然后输出结果。
代码
#include<iostream> using namespace std; const int maxn = 10; int main(){ int m; int fact[maxn]; for(int i = 1; i < maxn; i++) { int a = 1; for(int j = i; j > 0; j--){ a *= j; } fact[i] = a; } cin >> m; while(m--){ int n,s,k; cin >> n; s = n; k = 0; //1 2 6 24 120 720 5040 40320 362880 for(int j = maxn; j > 1 && s ;){ for(int i = j - 1; i < j && i > 0; i--){ if(fact[i] <= s) { j = i ; break; } } s -= fact[j]; if(s == 0) k = 1; } if(k) cout << "Yes" << endl; else cout << "No" << endl; } return 0; }