阶乘之和

xiaoxiao2021-02-28  111

描述

给你一个非负数整数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; }

转载请注明原文地址: https://www.6miu.com/read-2612709.html

最新回复(0)