快快编程797题应该怎么做?

小明对数字“5”和“8”非常感兴趣,认为是幸运数字,那么仅用幸运数字组成的整数就是幸运整数,请你帮助小明找出从5开始从小到大第k个幸运整数。

仅由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个数的数值,符合要求,望采纳~

温馨提示:答案为网友推荐,仅供参考
相似回答