C/C++ 手写实现进制转换

发布时间 2023-12-02 14:26:24作者: BryceAi

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

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 内容的整数值。
  • 若被转换值落在对应返回类型的范围外,则发生值域错误(设 errnoERANGE )并返回LONG_MAXLONG_MINLLONG_MAXLLONG_MIN
  • 若无法进行转换,则返回 ​0​ 。