第九届蓝桥杯省赛C++A组 第几个幸运数

标题:第几个幸运数

到x星球旅行的游客都被发给一个整数,作为游客编号。

x星的国王有个怪癖,他只喜欢数字3,5和7。

国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品。

我们来看前10个幸运数字是:

3 5 7 9 15 21 25 27 35 45

因而第11个幸运数字是:49

小明领到了一个幸运数字 59084709587505,他去领奖的时候,人家要求他准确地说出这是第几个幸运数字,否则领不到奖品。

请你帮小明计算一下,59084709587505是第几个幸运数字。

需要提交的是一个整数,请不要填写任何多余内容。

 

答案:1905

思路:用1作为初始值,先将1分别乘上3、5、7得到3、5、7,再将这三个数分别乘上3、5、7得到9、15、21;15、25、35;21、35、49,以此类推。需要注意的是,为了得到59084709587505的正确序号,我们得保证前面依次乘出来的数要从小到大排序,并且不能重复,于是就要用的priority_queue和set。

代码:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;

priority_queue<long long,vector<long long>,greater<long long> > q;
set<long long> s;
 
int main()
{
	int ans=-1;
	q.push(1);
	s.insert(1);
	while(1)
	{
		long long n=q.top();
		q.pop();
		ans++;
		if(n==59084709587505)
			break;
		for(int i=3;i<=7;i+=2)
		{
			long long t=n*i;
			if(!s.count(t))
			{
				q.push(t);
				s.insert(t);
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ryo_218/article/details/84866037