为了使代码足够简洁,没有对于部分可能出现的错误进行处理,比如输入的进制不合法等等。主要是针对于算法题目。
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 。