问题标题: 酷町堂:1199

0
0
已解决
黄子澄
黄子澄
中级天翼
中级天翼

#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;
}


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);
}

望采纳,谢谢

0
我要回答