阶数的和(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;
} 

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

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

全部评论

相关推荐

03-17 21:03
上海大学 Java
选择题包括内存页式管理,最多几页,然后给出一串页编号序列,问总共发生几次缺页,几次置换。深度学习里面有哪个步骤(探索还是开发)?作为成员的内部类不能使用static?还是不能用final?服务器不可用,HTTP状态码是?int&nbsp;x,&nbsp;y&nbsp;=&nbsp;2,&nbsp;5;&nbsp;x,&nbsp;y,&nbsp;x&nbsp;=&nbsp;x&nbsp;*&nbsp;2,&nbsp;x&nbsp;-&nbsp;y,&nbsp;x&nbsp;*&nbsp;y;&nbsp;print(x,&nbsp;y);&nbsp;求输出结果删除整个表记录,但是保留表结构。用delete还是truncate云计算不包括哪个部分&nbsp;A&nbsp;硬件&nbsp;B&nbsp;应用&nbsp;C&nbsp;中间件&nbsp;D&nbsp;udp用户数据报协议的用户数据最大是多少字节?62215&nbsp;62235&nbsp;?算法题包括T1&nbsp;洗盘子。n个盘子从上到下排列,编号1到n。现在可以从上到下一次拿一个洗,也可以一次拿出几个(l-r),然后倒序洗(r-l)。现在给一个序列,表示盘子的清洗顺序。让你判断是否合法?输入是tnx&nbsp;x&nbsp;x&nbsp;x...t是测试用例组数,n是该组用例的数组长度,也就是盘子数量n。最后的x就是盘子的清洗顺序。输出是yesno若该组测试用例T2&nbsp;子序列复制粘贴。现有两个字符串S和T。我们可以对T做一些操作,使得S成为T的子串。1.&nbsp;复制。记录当前T序列,并保存在剪切板中2.&nbsp;粘贴,将剪切板中的序列连接到当前T串后。最后判断经过几次操作,可以满足题目要求(子串)。输入S串T串输出满足题意的数字
查看10道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务