1 条题解
-
0
超大正整数转十六进制(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; }核心思路
- 大数处理 18位整数远超普通数值类型范围,必须用字符串存储。
- 进制转换规则
十进制转十六进制:除16取余,逆序排列
- 每次用大数除以16,得到的余数就是一位十六进制数
- 把所有余数逆序拼接,就是最终结果
- 字符映射 余数 0~9 → 直接用数字 余数 10~15 → 对应 A~F(大写)
测试示例
输入:
100000000000输出:
174876E800总结
- 18位超大数必须用字符串处理
- 十进制转十六进制核心:除16取余,逆序输出
- 代码支持0和18位全9的极限情况,完全符合题目要求
- 1
信息
- ID
- 748
- 时间
- 1000ms
- 内存
- 16MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 3
- 上传者
粤公网安备44195502000195号