题目描述:
将M进制的数X转换为N进制的数输出。
输入:
输入的第一行包括两个整数:M和N(2<=M,N<=36)。 下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。
输出:
输出X的N进制表示的数。
样例输入:
10 2
11
样例输出:
1011
提示:
注意输入时如有字母,则字母为大写,输出时如有字母,则字母为小写。
实现代码:
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <algorithm>
#include <math.h>
using namespace std
;
char ans2
[1000];
struct bign
{
int d
[1000];
int len
;
bign(){
memset(d
,0,sizeof(d
));
len
=0;
}
};
bign
change(char str
[]){
bign a
;
a
.len
=strlen(str
);
for(int i
=0;i
<a
.len
;i
++){
if(str
[a
.len
-i
-1]>='0'&&str
[a
.len
-i
-1]<='9'){
a
.d
[i
]=str
[a
.len
-i
-1]-'0';
}else if(str
[a
.len
-i
-1]>='A'&&str
[a
.len
-i
-1]<='Z'){
a
.d
[i
]=str
[a
.len
-i
-1]-'A'+10;
}
}
return a
;
}
bign
divide(bign a
,int b
,int& r
,int m
){
bign c
;
c
.len
=a
.len
;
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>=1&&c
.d
[c
.len
-1]==0){
c
.len
--;
}
return c
;
}
char* m_to_n(bign a
,int n
,int m
){
int i
=0;
while(a
.len
!=1||a
.d
[0]!=0){
int r
=0;
a
=divide(a
,n
,r
,m
);
if(r
>=0&&r
<=9){
ans2
[i
++]=r
+'0';
}else if(r
>9){
ans2
[i
++]=r
-10+'a';
}
}
return ans2
;
}
int main(){
int m
,n
;
char x
[10000];
while(scanf("%d%d",&m
,&n
)!=EOF){
scanf("%s",&x
);
bign a
=change(x
);
char* ans
;
ans
=m_to_n(a
,n
,m
);
int len
=strlen(ans
);
for(int i
=len
-1;i
>=0;i
--){
printf("%c",ans
[i
]);
}
printf("\n");
memset(ans2
,0,sizeof(ans2
));
}
return 0;
}