蓝桥杯2018年A组-试题D-第几个幸运数
0.题目

1.题解
1.1 DFS搜索(失败)
思路
思路很简单,但是还有可能遇到重复的情况,比如像3->35->353 和 5->53->533 是重复的
但是递归过深,导致超时.
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int ans = 0;
set<ll> s;
void DFS(ll num){
if(num > 3579152125273545) return;
s.insert(num);
DFS(num * 3);
DFS(num * 5);
DFS(num * 7);
}
int main(){
DFS(1);
for(auto num: s){
cout << num << endl;
}
cout << s.size() - 1;
}
1.2 暴力枚举
思路
这里我们获取相应的小于num的数的顺序并不重要(因为我们只需要获取总个数)
这里其实就是 3^i * 5^j * 7^k 即为组成结构
但要注意,由于这里包括了 i=0,j=0,k=0的情况,包含了1在里面,需要减掉即可
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll num = 59084709587505;
int ans = 0;
int main(){
for(int i = 0; pow(3, i) < num; i++){
for(int j = 0; pow(5, j) < num; j++){
if(pow(3, i) * pow(5, j) > num) break;
for(int k = 0; pow(7, k) < num; k++){
if(pow(3, i) * pow(5, j) * pow(7, k) <= num)
ans++;
else break;
}
}
}
cout << ans - 1;
return 0;
}

浙公网安备 33010602011771号