/*
求任意两个不同进制非负整数的转换,所给整数在long范围。不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1...,9,A,B,...,F)
输入:
一行,3个整数a,n,b.a表示其后的n是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2<=a,b<=16
输出:
该整数转换后的b进制数,字母符号大写表示(0,1,...,9,A,B,...,F)
输入:
15 Aab3 7
输出:
210306
提示:可以用字符串表示不同进制的整数
思路:
a->10->b
a进制先转换为10进制,利用各位依次乘以10的0次方,1次方,。。。.10进制转换为进制,利用除k取余法。
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char* argv[])
{
long a,b;
char n[20];
while(EOF!=scanf("%d %s %d",&a,n,&b))
{
long lSum = 0;
for(int i = 0 ; n[i]!='\0' ; i++ )
{
//关键还需要将a转换为10
int x;
if(n[i] <= 'z' && n[i] >= 'a')
{
x = n[i] - 'a' + 10;
}
else if(n[i] <= 'Z' && n[i] >= 'A')
{
x = n[i] - 'A' + 10;
}
else if(n[i] <= '9' && n[i] >= '0')
{
x= n[i] - '0';
}
//lSum += lSum*a + x;//易错,这里不是lSum +=,而是lSum =
lSum = lSum*a + x;
//printf("%ld",lSum);
}
printf("%ld\n",lSum);
//接下来将10进制数转换为b进制数,采用除b取余的方法
int iBit[20],j = 0;
char sBit[20];
do{
//iBit[j++] = lSum % b;//易错,这边还需要将超过10的数字转换为字符,所以不管数字和字符统一用字符表示
iBit[j] = lSum % b;
sBit[j] = iBit[j] < 10 ? (iBit[j] + '0') : (iBit[j] - 10 + 'A');
lSum /= b;
j++;
}while(lSum);
sBit[j] = '\0';
//逆序打印
j--;
for(; j >= 0 ; j--)
{
printf("%c",sBit[j]);
}
}
system("pause");
getchar();
return 0;
}