进制转换其实一类特殊的数位拆解问题。
基本思路
要完成m进制到n进制的转换,只需要完成(1)m进制转换成10进制,(2)10进制转换成n进制。
对于(1),只需要依次计算每个数位与该位权重的积,然后累加即可。
对于(2),只需要不断地对这个数对n求模,再除以n即可,这一点是和10进制的数位拆解相似的。
注意点
1.当以字符串形式读入一个数时,字符串的低位时数值的高位。例如读入str="3346456",str[0]='3'。
2.为什么下面要使用do while语句,这是为了num==0时,保证循环至少一次。当然也可以其它方法处理这个问题,如count==0时,直接输出0。总之是要对0特殊处理。
#include<iostream>
using namespace std;
int main(void)
{
int m;int n;//原进制和待转换进制
while(cin>>m>>n)
{
string str;
cin>>str;
long long int num=0;
for(int i=0;i<str.length();i++)
{
int temp;
if(str[i]>='0'&&str[i]<='9') temp=str[i]-'0';
else if(str[i]>='A'&&str[i]<='Z') temp=str[i]-'A'+10;
else if(str[i]>='a'&&str[i]<='z') temp=str[i]-'a'+10;
num=num*m+temp;
}//转换成10进制
char ans[100];
int count=0;
do{
int bit = num % n ;
if(bit>=0&&bit<=9) ans[count]='0'+bit;
else if(bit>=10&&bit<=36) ans[count]='A'+bit-10;
num = num /n ;
count++;
}while(num);//转换为n进制
for(int i=0;i<count;i++) cout<<ans[count-i-1];
cout<<endl;
}
return 0;
}