考研机试 阶乘的和
给定一个非负整数 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 <stdio.h>
#include <set>
#include <vector>
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中查找