考研机试 阶乘的和

考研机试 阶乘的和

给定一个非负整数 n,请你判断是否存在一些整数 xi,能够使得 n=∑1≤i≤txi!,其中 t≥1,xi≥0,xi=xj iff i=j。iff表示当且仅当。
输入格式
输入包含多组测试数据。
每组数据占一行,包含一个非负整数 n。
最后一行是一个负数,表示输入结束,无需处理。
输出格式
每组数据输出一行结果,如果 n
能表示为若干数的阶乘之和,则输出 YES,否则输出 NO。
数据范围
0≤n≤106,
每组输入最多包含 100组数据。
输入样例:
9
-1

用set空间换时间 把所有可能性都生成好

#include 
#include 
#include 
using namespace std;
int main(){
    vector<int> fA;
    fA.push_back(1);
   int curfA=1;
    for(int i=1;i<=9;++i){
        curfA=curfA*i;
        fA.push_back(curfA);
    }
    set<int> allpossible;
    allpossible.insert(0);
    for(int i=0;i<=9;++i){
        set<int> tempSet;
        set<int>::iterator it;
        for(it=allpossible.begin();it!=allpossible.end();++it){
            tempSet.insert(*it+fA[i]);
        }
        for(it=tempSet.begin();it!=tempSet.end();++it){
            allpossible.insert(*it);
        }

    }allpossible.erase(0);
    int n;
    while(scanf("%d",&n)!=EOF){
        if(n<0){
            break;
        }
        //需要计算从0!开始计算阶乘 和至少有一项
        //xi=xj,i=j 阶乘不能重复 阶乘范围小于100万 阶乘的范围是0到9的阶乘
        if(0==allpossible.count(n)){
            printf("NO\n");
        }else if(1==allpossible.count(n)){
            printf("Yes\n");
        }
    }


}

思路 利用set将所有的情况都提前存储 根据每个输入的数据在set中查找

你可能感兴趣的:(考研,算法,数据结构,c++)