传送门
到x星球旅行的游客都被发给一个整数,作为游客编号。
x星的国王有个怪癖,他只喜欢数字3,5和7。
国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品。
前10个幸运数字是:3 5 7 9 15 21 25 27 35 45,因而第11个幸运数字是:49
小明领到了一个幸运数字 59084709587505。
去领奖的时候,人家要求他准确说出这是第几个幸运数字,否则领不到奖品。
请你帮小明计算一下,59084709587505是第几个幸运数字。
输出
输出一个整数表示答案
这题一开始思路有点问题,想着直接用循环判断从3~59084709587505……结果发现等待是漫长的……因为数据太大了它就是不出结果呀
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxx=0x3f3f3f3f;
const ll n=20210411;
const ll mod=1e9+7;
bool find(ll x){
while(x!=1){
if(x%3==0){
x/=3;continue;
}else if(x%5==0){
x/=5;continue;
}else if(x%7==0){
x/=7;continue;
}else return 0;
}
return 1;
}
int main()
{
// ios_base::sync_with_stdio(false);
ll n=59084709587505,ans=0;
// ll n=49,ans=0;
for(ll i=3;i<=n;i+=2){
if(find(i))ans++;
}
cout<<ans;
return 0;
}
所以需要换一个思路,运用pow()函数三个循环将小于59084709587505的数都+1(因为循环得到的每个数均为有效的幸运数字)就可以得到结果啦~
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxx=0x3f3f3f3f;
const ll n=20210411;
const ll mod=1e9+7;
int main()
{
// ios_base::sync_with_stdio(false);
ll n=59084709587505,ans=0;
// ll n=49,ans=0;
for(int i=0;pow(3,i)<=n;i++){
for(int j=0;pow(5,j)<=n;j++){
for(int k=0;pow(7,k)<=n;k++){
if(pow(3,i)*pow(5,j)*pow(7,k)<n)ans++;
}
}
}
cout<<ans;
return 0;
}