题目描述
将M进制的数X转换为N进制的数输出。
输入
输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。
输出
输出X的N进制表示的数。
样例输入
10 2
11
样例输出
1011
提示
注意输入时如有字母,则字母为大写,输出时如有字母,则字母为小写。
思路:参考我之前写的一篇文章思路:大数的进制转换。
需要注意的是:假设输入里含有字母,比如A,则需要将A转换为10对应的ASCII码,ASCII码表里’9’的下一位是分号’:’,所以这里就将分号’:‘等价于数字10的ASCII码,‘B’对应11,11对应到’;’,后续依次类推。在运算过程中将’:'减去’0’也就还原得到了10这个数字。最后输出的时候如果有大于9的数,再转换成对应字母即可。
#include <cstdio>
#include <cstring>
char num[1010], ans[1010];
void trans(int a, char num[], int b) { //进制a的数num转换为进制b
int len = strlen(num);
int i, j, m, n, k = 0;
for (i = 0; i < len; i++) {
if (num[i] >= 'A' && num[i] <= 'Z') {
num[i] = num[i] - 'A' + '9' + 1; //将字母输入转换成对应数字的ASCII码
}
}
for (i = 0; i < len;) {
m = 0;
for (j = i; j < len; j++) {
n = (m * a + num[j] - '0') % b; //当前这轮的余数
num[j] = (m * a + num[j] - '0') / b + '0'; //变更当前位的数
m = n; //把余数传给下一位
}
ans[k++] = char(m + '0'); //记录该轮的余数
while (num[i] == '0') { //仅当最高位变成0时才移到下一位
i++;
}
}
for (i = k - 1; i >= 0; i--) { //从后往前输出余数
if (ans[i] >= '0' && ans[i] <= '9') {
printf("%c", ans[i]);
} else {
printf("%c", ans[i] - 1 - '9' + 'a'); //大于9的数转换成对应字母
}
}
printf("\n");
}
int main() {
int m, n, cnt;
while (scanf("%d %d", &m, &n) != EOF) {
scanf("%s", num);
trans(m, num, n);
}
return 0;
}