题目描述:
将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;
}
// 对m进制数依次除以n,等到余数组成数组的倒序进位所求n进制的数
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;
}