阶数的和(AcWing3481)

原文链接:https://www.acwing.com/problem/content/3484/

//阶乘的和
//思路:因为n最大不超过100万,根据程序输出发现10!超过100万了,所以阶乘的范围是0!~9!
//将0~9的阶乘放在动态数组里;将所有阶乘和的可能性放在一个集合里,
//根据输入值判断,是否在集合里有一个数与n相等;若有,则输出YES;否则输出NO
 
#include <stdio.h>
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int main(){
	vector<int> jc;//存放0~9的阶乘 
	int i,cursum=1;
	jc.push_back(1);
	for(i=1;i<10;++i){
		cursum=cursum*i;//计算每个数的阶乘,并把他们放进jc数组里 
		jc.push_back(cursum);
		
	}
	//输出0~9的阶乘 
//	for(i=0;i<10;++i){
//		printf("%d:%d\n",i,jc[i]);
//	}
//计算所有阶乘和的可能性
    
    set<int> allPossible;
    allPossible.insert(0);
    set<int> tempSet;//将allPossible加上下一个阶乘后的集合放进tempSet集合中 
	set<int>::iterator it;
	for(i=0;i<10;++i){ //所有阶乘加or不加 
		 for(it=allPossible.begin();it!=allPossible.end();++it){
		 	tempSet.insert(*it+jc[i]);
		 }
	      for(it=tempSet.begin();it!=tempSet.end();++it){
 	        allPossible.insert(*it);//将加上下一个阶乘后的集合并入allPossible 
	}		 
	}

	allPossible.erase(0);
	
	int n;
	while(scanf("%d",&n)!=EOF){
		if(n<0){
			break;
		}
		if(allPossible.count(n)!=0){
			printf("YES\n");
		}
		else{
			printf("NO\n");
		}
	}
	
	return 0;
} 

王道机试指南 文章被收录于专栏

这个专栏是参考王道机试指南中相关的练习题哦

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务