进制转化——高阶转化之x进制转y进制

184 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」第6天,点击查看活动详情 上篇文章我们讲到了x进制转10进制,和10进制转x进制的内容

大家感兴趣的可以看看

juejin.cn/post/717320…

我们来回顾下x进制转10进制的核心过程和代码

int zhuanhua(int N) {
	int sum = 0,Pow=1;
	while (N) {//N是X进制数
		sum += (N % 10)*Pow;
		N /= 10;//每次加完一位数*倍率,之后就到下一位
		Pow *= X;
	}//最后sum就是N在10进制下的数啦
	return sum;
}

然后是 10进制转x进制的核心过程

int ten_to_x(int N, int X) {
	int sum = 0,ans=0;
	while (N) {
		sum = sum * 10 + N % X;
		N /= X;
	}
	while (sum) {
		ans = ans * 10 + sum % 10;
		sum /= 10;
	}return ans;
}

x进制转y进制

x进制数一般情况下是是不能直接转到除10进制外的其他进制

所以我们在x进制转y进制过程中,我们会先将这个x进制的数转为10进制,之后再转为y进制

也就是说我们只需要将上面两种代码整合起来就行

int X_to_ten(int N,int X) {
	int sum = 0,Pow=1;
	while (N) {//N是X进制数
		sum += (N % 10)*Pow;
		N /= 10;//每次加完一位数*倍率,之后就到下一位
		Pow *= X;//X是进制数
	}//最后sum就是N在10进制下的数啦
	return sum;
}
int ten_to_x(int N, int X) {
	int sum = 0,ans=0;
	while (N) {
		sum = sum * 10 + N % X;
		N /= X;
	}
	while (sum) {
		ans = ans * 10 + sum % 10;
		sum /= 10;
	}return ans;
}

int X_to_Y(int X,int N,int Y){
	int ten_num = X_to_ten(N,X);
	return ten_to_x(ten_num,Y);
}

如此我们便将X进制转Y进制的实现写好了。

但只是这样还远远不够,我们上面写出的实现都是基于X和Y小于10的情况,如果进制一旦大于10

那么就会有字母出现,所以我们还得处理特殊情况。

在X进制转10进制的时候:如果发现某位是字母,那么就减去‘A’,这等同于减去它的ASCII码,如何再让sum加上值乘上倍率就行

在10进制转X进制时候也是一样的,注意好进制大于10的情况。

下面是完整的转化函数代码:

char* x_to_ten1(char *n, int X) {
	// 有可能含有字母 输入字符串
	int len = strlen(n),sum=0,Pow=1;
	for (int i = len - 1; i >= 0; i--) {
		int val = 0;
		if (n[i] > '9') val= n[i] - 'A';
		else val = n[i] - '0';
		sum += val * Pow;
		Pow *= X;
	}
	char *str = new char[233]{ "" }, *ans = new char[233]{""}; int cnt = 0;
	while (sum) {
		str[cnt++] = (sum % 10)+'0';
		sum /= 10;
	}
	for (int i = 0; i < cnt; i++)
		ans[i] = str[cnt - i - 1];
	return ans;
}// 函数返回值是一个char字符串
char* ten_to_x1(int N, int X) {
	char *ans = new char[233]{ "" }, *ans_real = new char[233]{ "" }; int cnt = 0;
	while (N) {
		if (X > 10) {
			if (N%X > 9)
				ans[cnt++] = 'A' + (N%X) - 10;
			else ans[cnt++] = (N % X) + '0';
		}
		else {
			ans[cnt++] = (N % X) + '0';
		}
		N /= X;
	}
	for (int i = 0; i < cnt; i++)
		ans_real[i] = ans[cnt - i - 1];

	return ans_real;
}
int str_to_num(char *str1) {
	int sum = 0;
	int len = strlen(str1);
	for (int i = 0; i < len; i++)
		sum = sum * 10 + str1[i] - '0';
	return sum;
}
char* x_to_y1(int X, char* str, int Y) {
	char *ten_num = x_to_ten1(str, X);
	int sum = str_to_num(ten_num);
	char *ans = ten_to_x1(sum, Y);
	return ans;
}