【题解】蓝桥 - 第几个幸运数字
作者:互联网
题目描述
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
C++代码实现
#include<iostream>
#include <cstdio>
#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个新的丑数
- 需要注意的是,同一个丑数有多种生成方式,所以需要判断一个丑数是否已经生成过
C++代码实现
#include<iostream>
#include <cstdio>
#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
标签:丑数,第几个,int,题解,LL,蓝桥,luckNum,幸运,include 来源: https://www.cnblogs.com/Yi-Shan/p/15840635.html