1 条题解

  • 0
    @ 2026-4-12 9:15:51

    超大正整数转十六进制(18位大数处理)

    这道题的关键:输入是18位超大整数,普通的long long存不下,必须用字符串读入,然后模拟大数除16取余的方式转换为十六进制。

    C++ 完整代码

    #include <iostream>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    // 大数除法:字符串表示的数字 / 16,返回商(字符串),余数存到引用中
    string divideBy16(string num, int &remain) {
        string res;
        long long carry = 0; // 用long long防止溢出
        for (int i = 0; i < num.size(); i++) {
            carry = carry * 10 + (num[i] - '0');
            res += (char)(carry / 16 + '0');
            carry = carry % 16;
        }
        remain = carry; // 余数就是当前位的十六进制数
        
        // 去掉前导0
        int pos = 0;
        while (pos < res.size() && res[pos] == '0') pos++;
        if (pos == res.size()) return "0";
        return res.substr(pos);
    }
    
    int main() {
        string s;
        cin >> s;
        string hexRes;
        // 十六进制字符表
        char hexChar[] = "0123456789ABCDEF";
        
        // 特殊处理输入为0的情况
        if (s == "0") {
            cout << "0" << endl;
            return 0;
        }
        
        // 循环除16取余
        while (s != "0") {
            int rem;
            s = divideBy16(s, rem);
            hexRes += hexChar[rem]; // 余数对应十六进制字符
        }
        
        // 反转得到正确顺序
        reverse(hexRes.begin(), hexRes.end());
        
        cout << hexRes << endl;
        return 0;
    }
    

    核心思路

    1. 大数处理 18位整数远超普通数值类型范围,必须用字符串存储
    2. 进制转换规则 十进制转十六进制:除16取余,逆序排列
      • 每次用大数除以16,得到的余数就是一位十六进制数
      • 把所有余数逆序拼接,就是最终结果
    3. 字符映射 余数 0~9 → 直接用数字 余数 10~15 → 对应 A~F(大写)

    测试示例

    输入:

    100000000000
    

    输出:

    174876E800
    

    总结

    1. 18位超大数必须用字符串处理
    2. 十进制转十六进制核心:除16取余,逆序输出
    3. 代码支持018位全9的极限情况,完全符合题目要求
    • 1

    信息

    ID
    748
    时间
    1000ms
    内存
    16MiB
    难度
    10
    标签
    递交数
    3
    已通过
    3
    上传者