题目描述
将M进制的数X转换为N进制的数输出。
输入
输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。
输出
输出X的N进制表示的数。
样例输入
10 2 11
样例输出
1011
注:此题为大数进制转换,做除法运算的时候带入的余数要先清0;
#include<stdio.h>
#include<string.h>
struct bign{
int d[1000];
int len;
bign(){
memset(d,0,sizeof(d));
len =0;
}
};
void print(bign a);
bign change(char str[])
{
int i;
bign a;
a.len=strlen(str);
for(i=0;i<strlen(str);i++)
{
if(str[a.len-1-i]-'0'<=9)
a.d[i]=str[a.len-1-i]-'0'; //字符低位是数值低位;
else if(str[a.len-1-i]-'0'>9)
a.d[i]=str[a.len-1-i]-'A'+10;
}
// printf("in function change:a.len=%d \n a=",a.len);
// print(a);
// printf("function change end\n");
return a;
}
bign divide(bign a,int m ,int n,int &r)
{
bign c;
c.len=a.len;
int i;
r=0;
for(i=a.len-1;i>=0;i--)
{
r=r*m+a.d[i];
if(r<n)
{
c.d[i]=0;
}
else{
c.d[i]=r/n;
r=r%n;
}
}
while(c.len>=1&&c.d[c.len-1]==0)c.len--;
return c;
}
void print(bign a)
{
int i;
printf("a=");
for(i=a.len-1;i>=0;i--){
printf("%d",a.d[i]);
}
printf("\na.len=%d\n",a.len);
}
int main()
{
int m,n,i,r,k;
char str[3000],c[3000];
bign a;
while(scanf("%d %d",&m,&n)!=EOF)
{
//getchar();
r=0,k=0;
scanf("%s",str);
a=change(str);
//i=0;
// printf("m=%d n=%d\n",m,n);
// puts(str);
// print(a);
// printf("--------------------------------------\n\n");
while(a.len>0)
{
// printf("-----------------while---------------------\n\n");
a=divide(a,m,n,r);
// print(a);
// printf("-------------------------------------------\n\n");
//printf("r=%d\n",r);
//printf("a.len=%d\n",a.len);
if(r>=0&&r<=9)
c[k++]=r+'0';
else if(r>9)
c[k++]=r-10+'a';
}
for(int i=k-1;i>=0;i--)
printf("%c",c[i]);
printf("\n");
}
return 0;
}