top1编程
← 返回题目
题解

【基础】二进制转换八进制

1 条题解

  • 0
    @ 2026-7-31 12:00:08

    解题思路

    题目要求把二进制数转换成八进制数。二进制最长 100 位,数字太大,不能直接算,要用一个巧妙的规律。

    核心规律:二进制的每 3 位,正好对应八进制的 1 位。

    比如二进制 111 是 7(八进制的一位 7),二进制 100 是 4。

    所以只要把二进制从右往左每 3 位分成一组,每组单独转成一个八进制数字,连起来就是答案。

    步骤:

    1. 如果二进制的位数不是 3 的倍数,在左边补 0,让长度变成 3 的倍数
    2. 从左边开始,每 3 位分成一组
    3. 每组单独转成八进制数字(0~7)
    4. 把所有数字连起来输出

    为什么每 3 位一组? 因为 8 = 2³,所以 3 位二进制正好表示 0~7,就是 1 位八进制。

    举例 二进制 111100001111000011110000(24 位):

    • 每 3 位一组:111 100 001 111 000 011 110 000
    • 转成八进制:7 4 1 7 0 3 6 0
    • 结果 74170360

    参考代码

    #include <iostream>
    #include <string>
    using namespace std;
    
    char num(string s) {
        int r = 0, t = 1;
        for (int i = s.size() - 1; i >= 0; i--) {
            r += (s[i] - '0') * t;
            t *= 2;
        }
        return char(r + '0');
    }
    
    int main() {
        string s;
        cin >> s;
    
        if (s.size() % 3 == 1) s = "00" + s;
        else if (s.size() % 3 == 2) s = "0" + s;
    
        for (int i = 0; i < s.size(); i += 3) {
            cout << num(s.substr(i, 3));
        }
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(N),N 为二进制位数
    • 空间复杂度:O(1)
    • 1