题目描述
将M进制的数X转换为N进制的数输出。
输入
输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。
输出
输出X的N进制表示的数。
样例输入 Copy
<span style="color:#333333"><span style="color:#333333">10 2
11</span></span>
样例输出 Copy
<span style="color:#333333"><span style="color:#333333">1011</span></span>
提示
注意输入时如有字母,则字母为大写,输出时如有字母,则字母为小写。
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct bign {
int d[1005], len;
bign() {
memset(d, 0, sizeof(d));
len = 0;
}
};
bign change(char s[]) {
int len=strlen(s);
int i;
bign a;
a.len=len;
for(i=0; i<len; i++) {
if(s[a.len - 1 - i] - '0' <= 9) {
a.d[i] = s[a.len - 1 - i] - '0';
} else {
a.d[i] = s[a.len - 1 - i] - 'A' + 10;
}
}
return a;
}
bign divide(bign a, int m, int b, int &r) {
bign c;
c.len = a.len;
r = 0;
for(int i = a.len - 1; i >= 0; i--) {
r = r * m + a.d[i];
if(r < b) { //不够除
c.d[i] = 0;
} else { //够除
c.d[i] = r / b;
r = r % b;
}
}
while(c.len >= 1 && c.d[c.len - 1] == 0) c.len--;
return c;
}
int main(int argc, char** argv) {
int m , n;
char ans[3000], s[3000];
while(scanf("%d %d", &m, &n) != EOF) {
scanf("%s", s);
bign a;
a = change(s);
// printf("after change\n");
// for(int i = 0; i < a.len; i++)
// printf("%d", a.d[i]);
// printf("\n");
int r = 0, j = 0;
while(a.len >= 1) {
a = divide(a, m, n, r);
if(r >= 0 && r <= 9) { //余数在0到9之间
ans[j++] = r + '0';
} else { //余数超过10
ans[j++] = r - 10 + 'a';
}
// printf("r:");
// printf("%d", r);
// printf("\n");
}
ans[j] = '\0';
for(int i = j - 1; i >= 0; i--) {
printf("%c", ans[i]);
}
printf("\n");
}
return 0;
}