仅由5和8组成的整数排序如下:
5 8 // 一位数共2个
55 58 85 88 // 两位数共2^2个
555 558 585 588 855 858 885 888 // 三位数共2^3
...
n位数一共2+2^2+...+2^n=2^(n+1)-2
由此可求得n与k的关系,在n位数中,前一半数最高位为5,后一半数最高位为8
可递归求得每位数的数值。C++代码如下:
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
string ans; // 保存最终结果
void dfs(int k) {
if (k <= 2) {
char c = k == 1 ? '5' : '8';
ans.push_back(c);
return;
}
int n = (int)log2(k + 1); // 该数为n位数
int start = (int)pow(2, n) - 1;
int half = (int)pow(2, n - 1); // n位数个数的一半
if (k - start + 1 <= half) { // 在n位数中的第几个
ans.push_back('5');
k -= half;
}
else {
ans.push_back('8');
k -= half * 2;
}
dfs(k); // 继续判断下一位数
}
int main() {
cout << "仅由5和8组成的整数的前50个数:\n";
for (int i = 1; i <= 50; i++) {
ans.clear();
dfs(i);
cout << ans << " ";
if (i % 10 == 0) cout << "\n";
}
int k;
cout << "\n输入仅由5和8组成的整数中的第几个数:\n";
cin >> k;
ans.clear();
dfs(k);
cout << "第" << k << "个数为: " << ans << endl;
return 0;
}
g++编译通过,运行结果如下:
输出了前50个数以及第1000个数的数值,符合要求,望采纳~