第几个幸运数(第九届蓝桥杯省赛C++A组)

第几个幸运数

到x星球旅行的游客都被发给一个整数,作为游客编号。x星的国王有个怪癖,他只喜欢数字3,5和7。国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品。我们来看前10个幸运数字是:3 5 7 9 15 21 25 27 35 45因而第11个幸运数字是:49小明领到了一个幸运数字 59084709587505,他去领奖的时候,人家要求他准确地说出这是第几个幸运数字,否则领不到奖品。请你帮小明计算一下,59084709587505是第几个幸运数字。需要提交的是一个整数,请不要填写任何多余内容。

做这题时我还不是很熟悉stl,走了很多弯路是真的菜,这里有一个博主总结的set容器的用法。

(https://www.cnblogs.com/zyxStar/p/4542835.html)

思路 取出队头,当对头<=幸运数字时,依次用对头*3 *5 *7 加入队尾,最后扫一遍set即可。set里元素是有序不重复的(真香)。

上代码、、、、、、、、、、、、、、、、、

#include<iostream>
#include<set>
#define LL long long
using namespace std;
LL maxs=59084709587505;
set<LL>q;
int main()
{
    q.insert(3);
    q.insert(5);
    q.insert(7);
    set<LL>::iterator it;
    it=q.begin();
    LL mid;
    while(*it<=maxs)
    {
        mid=*it;
        q.insert(mid*3);
        q.insert(mid*5);
        q.insert(mid*7);
        it++;
    }
    int num=0;
    for(it=q.begin();it!=q.end();it++)
    {
        if(*it<=maxs)num++;
    }
    cout<<num;
    return 0;
}

这里补充第二种暴力做法,三层for循环,枚举3 5 7所有不超过幸运数的方案lalalala

#include<iostream>
#include<cmath>
#include<algorithm>
#define LL long long
using namespace std;
const LL N=59084709587505;
LL int pows(LL int x,LL int cao)
{
    LL  int k=x;
    if(cao==0)return 1;
    for(int i=1;i<cao;i++)
    {
        x*=k;
    }
    return x;
}
int main()
{
    int num=0;
        for(LL int i=0,k1=pows(3,i);k1<=N;i++,k1=pows(3,i))
        {
            for(LL int j=0,k2=pows(5,j)*k1;k2<=N;j++,k2=pows(5,j)*k1)
             {
                    for(LL int p=0,k3=pows(7,p)*k2;k3<=N;p++,k3=pows(7,p)*k2)
                    {
                        num++;
                    }
              }
          }
    cout<<num-1;
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柯基吹泡泡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值