1 条题解
-
0
十六进制转八进制(超大数据:10万位)
这道题数据量极大(10万位),绝对不能转十进制中转,必须用字符串直接进制转换: 十六进制 → 二进制 → 八进制,这是最快、最安全的方法。
核心思路(必看)
- 1位十六进制 = 4位二进制
- 1位八进制 = 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; }
代码说明
- 十六进制转二进制 每一位十六进制直接替换成固定4位二进制,拼接成完整二进制串。
- 二进制转八进制
从右往左每3位分一组,计算值:
第1位×1 + 第2位×2 + 第3位×4 - 超大数支持 全程只用字符串操作,完美支持10万位输入。
- 格式规范 自动去掉前导0,保证输出无多余0。
测试样例
输入:
123ABC输出:
4435274
总结
- 超大数据进制转换:十六进制 → 二进制 → 八进制
- 1位十六进制 = 4位二进制
- 1位八进制 = 3位二进制
- 代码可直接AC,效率极高,无任何超时风险
- 1
信息
- ID
- 758
- 时间
- 1000ms
- 内存
- 32MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者
粤公网安备44195502000195号