1 条题解

  • 0
    @ 2026-4-12 9:19:20

    十六进制转八进制(超大数据:10万位)

    这道题数据量极大(10万位),绝对不能转十进制中转,必须用字符串直接进制转换十六进制 → 二进制 → 八进制,这是最快、最安全的方法。


    核心思路(必看)

    1. 1位十六进制 = 4位二进制
    2. 1位八进制 = 3位二进制
    3. 步骤:
      • 十六进制字符串 → 补足前导0的4位二进制串
      • 二进制串从右往左每3位分组 → 转八进制
      • 去掉前导0,输出结果

    C++ 满分代码(可处理10万位)

    #include <iostream>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    int main() {
        // 十六进制每一位 对应 4位二进制
        string hex2bin[] = {
            "0000", "0001", "0010", "0011",
            "0100", "0101", "0110", "0111",
            "1000", "1001", "1010", "1011",
            "1100", "1101", "1110", "1111"
        };
    
        string hex;
        cin >> hex;
        string bin;
    
        // 第一步:十六进制 转 二进制
        for (char c : hex) {
            int num;
            if (c >= '0' && c <= '9') num = c - '0';
            else num = 10 + (c - 'A');
            bin += hex2bin[num];
        }
    
        // 第二步:二进制 转 八进制(从右往左每3位分组)
        reverse(bin.begin(), bin.end());
        string oct;
    
        for (int i = 0; i < bin.size(); i += 3) {
            int val = 0;
            if (i < bin.size()) val += (bin[i] - '0') * 1;
            if (i+1 < bin.size()) val += (bin[i+1] - '0') * 2;
            if (i+2 < bin.size()) val += (bin[i+2] - '0') * 4;
            oct += (char)('0' + val);
        }
    
        // 翻转回正确顺序
        reverse(oct.begin(), oct.end());
    
        // 第三步:去掉前导0
        int pos = 0;
        while (pos < oct.size() && oct[pos] == '0') pos++;
        if (pos == oct.size()) cout << "0";
        else cout << oct.substr(pos) << endl;
    
        return 0;
    }
    

    代码说明

    1. 十六进制转二进制 每一位十六进制直接替换成固定4位二进制,拼接成完整二进制串。
    2. 二进制转八进制 从右往左每3位分一组,计算值:第1位×1 + 第2位×2 + 第3位×4
    3. 超大数支持 全程只用字符串操作,完美支持10万位输入。
    4. 格式规范 自动去掉前导0,保证输出无多余0。

    测试样例

    输入:

    123ABC
    

    输出:

    4435274
    

    总结

    1. 超大数据进制转换:十六进制 → 二进制 → 八进制
    2. 1位十六进制 = 4位二进制
    3. 1位八进制 = 3位二进制
    4. 代码可直接AC,效率极高,无任何超时风险
    • 1

    信息

    ID
    758
    时间
    1000ms
    内存
    32MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者