题目描述
将M进制的数X转换为N进制的数输出。
输入描述:
输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。
输出描述:
输出X的N进制表示的数。
示例1
输入:
10 2 11
输出:
1011
备注:
注意输入时如有字母,则字母为大写,输出时如有字母,则字母为小写。
题目链接:进制转换2_牛客题霸_牛客网
这一次题目要求我们将一个M进制数转换为N进制数,其中M和N为任给的位于区间[2,36]内的整数。对这个题不知从何下手的读者,可以先做做十进制数转二进制数和十六进制数转十进制数。做过这两道题的读者,应该很容易反应过来这道题就是要我们将前两道题的代码成果做一个结合。
我们首先将给出的M进制数A转换为十进制数B,再将十进制数B转换为N进制数C输出,最后的C即为所求。在转换过程中思想依然是求余转换,反向打印,只是计算过程中需要用十进制做承接。由于最高达到三十六进制,我们刚好使用0~9、a~z作为数码。
注意到题目给出的进制的范围为[2,36],这就暗示读者至少应该使用一个长整型存储中间的十进制以避免溢出。其次在转换中我们要注意到字母按大写输入,小写输出。以下是写者用字符数组实现的代码。
#include <stdio.h>
int main() {
int M = 0,N = 0,l = 0;
long sum = 0;
char c[100];
char d[100];
scanf("%d %d %s",&M,&N,&c);
for(int i = 0; c[i] != 0; i++){//先转十进制
sum *= M;
sum += c[i] <= '9' ? c[i] - '0' : c[i] - 'A' + 10;
}
while(sum >= N) {//再转N进制
d[l] = sum%N > '9' ? sum%N - 10 + 'a' : sum%N + '0';
l++;
sum = sum/N;
}
d[l] = sum%N > '9' ? sum%N - 10 + 'a' : sum%N + '0';
while(l >= 0) {//反向输出
printf("%c",d[l]);
l--;
}
return 0;
}