#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<iomanip>
using namespace std;
long long b[1000005];
int main(){
int n,a=1,c;
cin>>n;
while(n--){
c=1;
for(int i=1;i<=n;i++){
a*=i;
b[i]=b[i-1]+a;
if(b[i]>=1000000){
break;
}
}
for(int i=1;i<=n;i++){
if(b[i]==n){
cout<<"YES\n";
c=0;
break;
}
if(b[i]>n){
cout<<"NO\n";
c=0;
break;
}
if(b[i]>=1000000){
break;
}
}
if(c){
cout<<"NO\n";
}
}
return 0;
}
我的思路:先输入m个n,然后再来个j循环start9,end1,如果n>=fact(j),就让n减去fact(j),再用剩下的数再执行以上的操作,直到n为0输出YES(因为他连续减去一个数的阶乘最后得到0,证明连续数的阶乘相加能得到他),如果最后连1的阶乘都用了还是不能为0,则输出NO
主要代码:
for (int i=1; i<=m; i++) {
cin >> n;
for (int j=9; j>=1; j--) {
if (n>=fact(j)) {
n -= fact(j);
}
}
if (n==0) cout << "YES" << endl;
else cout << "NO" << endl;
}
函数部分递归写法:
int fact(int x) {
if (x == 1) return 1;
return x * fact(x-1);
}
望采纳,谢谢
