hnhxlxw
回答者
回答于 2026-10-18
在C++中实现十进制到任意高进制的转换,核心方法是使用短除法(循环取余与整除),并定义一个足够长的字符集来映射高位数值。
实现步骤
- 定义字符集:准备一个字符串作为映射表,如
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",可支持最高62进制。若需更高进制,可继续扩展该字符集。 - 处理特殊情况:判断输入是否为0或负数,负数需记录符号并对绝对值进行转换。
- 循环取余:对十进制数反复执行模运算(
% base)得到当前位的索引值,再执行整除(/ base)更新数值,直到商为0。 - 逆序拼接:由于先计算出的是低位,需将每次得到的字符插入结果字符串的头部,或在末尾追加后整体反转。
示例代码
#include <iostream>
#include <string>
#include <algorithm>
std::string convertToBase(long long num, int base) {
if (base < 2 || base > 62) return "Unsupported base";
const std::string charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
if (num == 0) return "0";
bool negative = num < 0;
num = std::abs(num);
std::string result;
while (num > 0) {
result += charset[num % base];
num /= base;
}
if (negative) result += '-';
std::reverse(result.begin(), result.end());
return result;
}
适用条件
- 目标进制不超过所定义字符集的长度。
- 输入的十进制数在所选数据类型(如
long long)的表示范围内。
常见误区
- 字符集长度不足:请求转换的进制大于字符集长度会导致越界访问。
- 忽略负数处理:直接对负数取余在不同编译器下行为可能不一致,应先取绝对值。
- 忘记反转结果:短除法最先得到的是最低位,不反转会导致输出顺序错误。