题目来源:codeup 问题D:进制转换
题目描述
将M进制的数X转换为N进制的数输出。
输入
输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。
输出
输出X的N进制表示的数。
样例输入
10 2
11
样例输出
1011
提示
注意输入时如有字母,则字母为大写,输出时如有字母,则字母为小写。
提示:该题与codeup 10进制转为2进制类似。就是把10换成M,2换成N即可。
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
void change(char s[], int t[])
{
int len = strlen(s);
for (int i = 0; i < len; i++)
{
if (s[i] >= '0' && s[i] <= '9')
{
t[i] = s[i] - '0';
}
if (s[i] >= 'A' && s[i] <= 'Z')
{
t[i] = s[i] - 'A' + 10;
}
}
}
int main()
{
int M, N;
while (~scanf("%d %d", &M, &N))
{
int num = 0;
char m[100];
scanf("%s", m);
int m1[100]; //将大写字母替换成对应的数字
change(m, m1);
char n[100];
int k = strlen(m);
int len = strlen(m);
while (len > 0)
{
int r = 0; //r为余数
for (int i = 0; i < k; i++) //从高位开始
{
r = r * M + m1[i]; //和上一位遗留的余数组合,得到临时的被除数
if (r < N)
{
m1[i] = 0;
}
else
{
m1[i] = r / N;
r = r % N;
}
}
if (r <= 9 && r >= 0)
{
n[num++] = r + '0';
}
else if (r >= 10 && r <= 36)
{
n[num++] = r + 'a' - 10;
}
while (m1[k - len] == 0)
{
len--;
}
}
for (int i = num - 1; i >= 0; i--)
{
printf("%c", n[i]);
}
printf("\n");
}
return 0;
}