问题 D: 进制转换
时间限制: 1 Sec 内存限制: 32 MB
题目描述
将M进制的数X转换为N进制的数输出。
输入
输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。
输出
输出X的N进制表示的数。
样例输入
10 2
11
样例输出
1011
提示
注意输入时如有字母,则字母为大写,输出时如有字母,则字母为小写。
经验总结
emmmm,直接利用M进制转换为N进制的规则,注意操作对象为大整数即可~
AC代码
#include <cstdio>
#include <cstring>
struct bign
{
int d[1000];
int len;
bign()
{
memset(d,0,sizeof(d));
len=0;
}
};
bign change(char s[])
{
bign a;
a.len=strlen(s);
for(int i=0;i<a.len;i++)
{
if(s[a.len-i-1]>='0'&&s[a.len-i-1]<='9')
a.d[i]=s[a.len-i-1]-'0';
else if(s[a.len-i-1]>='A'&&s[a.len-i-1]<='Z')
a.d[i]=s[a.len-i-1]-'A'+10;
}
return a;
}
int main()
{
int m,n;
while(~scanf("%d %d",&m,&n))
{
char a[1000]={'\0'};
char out[1000]={'\0'};
scanf("%s",a);
bign b=change(a);
int k=b.len,len=b.len,num=0;
while(len>0)
{
int c=0;
for(int i=len-1;i>=0;i--)
{
int s=(b.d[i]+m*c)/n;
c=(b.d[i]+m*c)%n;
b.d[i]=s;
}
if(c>=0&&c<=9)
out[num++]=c+'0';
if(c>=10&&c<=36)
out[num++]=c+'a'-10;
while(b.d[len-1]==0)
len--;
}
for(int i=num-1;i>=0;i--)
printf("%c",out[i]);
printf("\n");
}
return 0;
}