题目:
到 X 星球旅行的游客都被发给一个整数,作为游客编号。
X 星的国王有个怪癖,他只喜欢数字 3,5 和 7。
国王规定,游客的编号如果只含有因子:3,5,7就可以获得一份奖品。
我们来看前 10个幸运数字是:
3 5 7 9 15 21 25 27 35 45
因而第 11 个幸运数字是: 49
小明领到了一个幸运数字 59084709587505,他去领奖的时候,人家要求他准确地说出这是第几个幸运数字,否则领不到奖品。
请你帮小明计算一下,59084709587505是第几个幸运数字。
思路:类似素数求法
- 生成法(筛法):从3开始的每一个数字乘于(3,5,7)得到的乘积insert到set中,直到出现MAX停止
代码:
#include <iostream>
#include<set>
using namespace std;
typedef long long LL;
// VisualC++6.0 环境运行下,将long long 用 _int64 进行替换。
const LL MAX = 59084709587505;
int main()
{
set<LL> s;
int a[3] = {3,5,7};
int init = 1;
while(true){
for(int i = 0 ; i < 3; i++){
if(init * a[i] <= MAX){
s.insert(init * a[i]);
}
}
init = *(s.upper_bound(init));
if(init >= MAX) break;
}
cout<<s.size()<<endl;//1905
return 0;
}
总结:
- set的用法
- 生成法(筛法)的使用