一、题目
到x星球旅行的游客都被发给一个整数,作为游客编号。
x星的国王有个怪癖,他只喜欢数字3,5和7。
国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品。
前10个幸运数字是:3 5 7 9 15 21 25 27 35 45,因而第11个幸运数字是:49
小明领到了一个幸运数字 59084709587505。
去领奖的时候,人家要求他准确说出这是第几个幸运数字,否则领不到奖品。
请你帮小明计算一下,59084709587505是第几个幸运数字。
输出
输出一个整数表示答案
二、思路
采用类似 质数筛法 的生成法 + set,set在这里可以 去重 和 排序。
用生成的每个幸运数,都去乘以3 5 7,再次生成幸运数......循环。
初始化一个指针 tou = 1,该指针指向一个有序不重复的队列s。
tou指向1
tou * 3 => 3
tou * 5 => 5
tou * 7 => 7
那么s: 3 5 7
tou指向3
tou * 3 => 9
tou * 5 => 15
tou * 7 => 21
那么s: 3 5 7 9 15 21
tou指向5
tou * 3 => 15(重复)
tou * 5 => 25
tou * 7 => 35
那么s: 3 5 7 9 15 21 25 35
tou指向7
tou * 3 => 21(重复)
tou * 5 => 35(重复)
tou * 7 => 49
那么s: 3 5 7 9 15 21 25 35 49
tou指向9
tou * 3 => 27
tou * 5 => 45(重复)
tou * 7 => 63
那么s: 3 5 7 9 15 21 25 27 35 49 63
......
三、代码
#include <iostream>
using namespace std;
typedef long long LL;
#include <set>
set<LL> s;
const LL MAX = 59084709587505;
int a[3] = {3,5,7};
//这里采用类似 质数筛法 的生成法 + set
//set在这里可以 去重 和 排序
//有点像高中化学点同构体的时候,不回头算
int main()
{
LL tou = 1;
while (1)
{
for (int i = 0; i < 3; i++)
{
LL tt = tou * a[i];
if (tt <= MAX)
s.insert(tt);
}
//更新tou
tou = *s.upper_bound(tou);
if(tou >= MAX)
break;
}
cout << s.size();
}