C/C++ 手写实现进制转换
为了使代码足够简洁,没有对于部分可能出现的错误进行处理,比如输入的进制不合法等等。主要是针对于算法题目。
10进制转换为其他进制(小于10进制)
// @param num: 待转换的10进制数
// @param base: 转换的进制
// @return: 转换后的字符串
string DTO(int num, int base)
{
string ret = "";
while(num)
{
ret.insert(ret.begin(), num % base + '0');
num /= base;
}
return ret;
}
10进制转换为其他进制(最高到36进制)
// @param num: 待转换的10进制数
// @param base: 转换的进制
// @return: 转换后的字符串
string DTO(int num, int base)
{
string ret = "";
while(num)
{
char c = num % base > 9 ? num % base - 10 + 'A' : num % base + '0';
ret.insert(ret.begin(), c);
num /= base;
}
return ret;
}
其他进制转换为10进制(小于10进制)
// @param num: 待转换的字符串
// @param base: 转换的进制
// @return: 转换后的10进制数
long long TOD(string num, int base)
{
reverse(num.begin(), num.end());
long long ret = 0, pow = 1;
for(int i = 0; i < num.size(); i++)
{
ret += pow * (num[i] - '0');
pow *= base;
}
return ret;
}
其他进制转换为10进制(最高到36进制)
// @param num: 待转换的字符串
// @param base: 转换的进制
// @return: 转换后的10进制数
long long TOD(string num, int base)
{
reverse(num.begin(), num.end());
long long ret = 0, pow = 1;
for(int i = 0; i < num.size(); i++)
{
ret += pow * (num[i] >= 'A' ? num[i] - 'A' + 10 : num[i] - '0');
pow *= base;
}
return ret;
}
使用库函数将十进制转换为其他进制
// 头文件:#include <stdlib.h>
char s[100];
itoa(8, s, 2);
cout << s;
itoa函数原型:
char *itoa(int value, char *string, int radix);
参数
value - 欲转换的数据。
string - 目标字符串的地址。
radix - 转换后的进制数。
这个函数需要谨慎使用,因为它不是标准库函数,而且在不同的编译器中可能有不同的实现。进制转换推荐使用 sprintf 函数,但是它只能将十进制转换为八进制或十六进制(也有可能是我不太会用)。推荐手写实现。
使用库函数将其他进制转换为十进制
// 头文件:#include <stdlib.h>
cout << strtol("1000", NULL, 2);
strtol函数原型:
long int strtol(const char *str, char **endptr, int base);
参数
str - 要转换为长整数的字符串。
str_end - 指向一个指针,存储转换后第一个无效字符的位置。
base - 进制数。
返回值:
- 若成功,则返回对应
str内容的整数值。 - 若被转换值落在对应返回类型的范围外,则发生值域错误(设
errno为ERANGE)并返回LONG_MAX、LONG_MIN、LLONG_MAX或LLONG_MIN。 - 若无法进行转换,则返回 0 。

浙公网安备 33010602011771号