开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」第6天,点击查看活动详情 上篇文章我们讲到了x进制转10进制,和10进制转x进制的内容
大家感兴趣的可以看看
我们来回顾下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;
}