1. 程式人生 > >第九屆藍橋杯省賽C++A組 第幾個幸運數

第九屆藍橋杯省賽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;
}