【题解】蓝桥 - 第几个幸运数字

题目描述

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

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

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

3 5 7 9 15 21 25 27 35 45

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

小明领到了一个幸运数字 59084709587505,要求他准确地说出这是第几个幸运数字

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

输入输出

直接输出一个整数,表示 59084709587505 是第几个幸运数字

分析及代码实现

  • 建立一个luckNum的集合类,用于储存求出的幸运数
  • luckNum 的begin位初始化为1,利用for循环,每次从luckNum中抛出第一个元素(即最小的元素)
  • 判断抛出的元素是否等于我们需要的幸运数字:
  • 若为,则输出对应的 i - 1(这里是从1开始的,因此需要减去一个1)
  • 若不为,则分别与{3,5,7}相乘,并判断是否已经存在
  • 不存在则将求出的数insert() 进luckNum

Code

#include <cstdio>
#include <iostream>
#include <set>
using namespace std;

typedef long long LL;
const LL X = 59084709587505;
const int coeff[3] = {3, 5, 7};
int main() {
    set<LL> luckNum;
    luckNum.insert(1);
    LL a;
    for (int i = 1;; i++) {
        //取出最小值(人为造的最小值)
        a = *luckNum.begin();
        //如果等于所求,输出
        if (a == X) {
            cout << i - 1 << endl;
            break;
        }

        //去除当前最小
        luckNum.erase(*luckNum.begin());

        //将当前最小值分别于3,5,7相乘
        for (int j = 0; j < 3; j++)
            //若c乘积不存在,则将求出的数加入进luckNum
            if (!luckNum.count(a * coeff[j]))
                luckNum.insert(a * coeff[j]);
    }
    return 0;
}

//最终答案为1905

本题的思路类似紫书上的丑数问题

丑数问题

丑数是指不能被2,3,5以外的其他素数整除的数。

把丑数从小到大排列起来,结果如下:

1,2,3,4,5,6,8,9,10,12,15,…

求第1500个丑数。

分析

  • 从小到大生成各个丑数。最小的丑数是 1
  • 对于任意丑数:x,2x、3x和5x也都是丑数
  • 用一个优先队列/set保存所有已生成的丑数,每次取出最小的丑数,生成3个新的丑数
  • 需要注意的是,同一个丑数有多种生成方式,所以需要判断一个丑数是否已经生成过

Code

#include <cstdio>
#include <iostream>
#include <set>
using namespace std;

typedef long long LL;
const LL X = 1500;
const int coeff[3] = {2, 3, 5};
int main() {
    set<LL> luckNum;
    luckNum.insert(1);
    for (int i = 1;; i++) {
        LL a = *luckNum.begin();
        luckNum.erase(*luckNum.begin());
        if (i == X) {
            cout << "the 1500th number is " << a << endl;
            break;
        }
        for (int j = 0; j < 3; j++)
            if (!luckNum.count(a * coeff[j]))
                luckNum.insert(a * coeff[j]);
    }
    return 0;
}

//答案为 859963392

posted @ 2022-01-24 19:10  Yi_Shan  阅读(216)  评论(0编辑  收藏  举报