0
点赞
收藏
分享

微信扫一扫

第几个幸运数字(蓝桥杯省赛2018C/C++A组第四题)

90哦吼 2022-02-04 阅读 75

题目:

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

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

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

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

3 5 7 9 15 21 25 27 35 45

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

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

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

思路:类似素数求法

  1. 生成法(筛法):从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;
}

总结:

  1. set的用法
  2. 生成法(筛法)的使用
举报

相关推荐

0 条评论