第几个幸运数
到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;
}