/******************************************************************************
*
编写了个进制转换程序,求鼓励。
*
常规思路:先转换成十进制,再转换成所需进制。所以最大只能转换到2^32-1。
*
我的思路:直接转换。
*
最近都在练习高精度,于是就把这个代码给搬过来了。
*
以下是代码:(原代码有错,现是改正后代码)
******************************************************************************/
#include<stdio.h>
#include<ctype.h>
char*change(char*dst,const char*src,int tobase,int frombase)
{
int carry=0,cnt,i,j,t;
const char index[]={"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"};/*转化为大写,若想改为小写只需更改这里即可*/
if(tobase<2||tobase>36||frombase<2||frombase>36)/*适用于2--36之间的进制转换*/
{
dst[0]=0;
return dst;
}
while(isspace(*src))src++;
for(dst[0]=0,cnt=1,i=0;src[i];i++)/*从这里开始把字符数组当做普通数组使用*/
{
if(isdigit(src[i]))
t=src[i]-'0';
else if(isupper(src[i]))/*大小写通用*/
t=src[i]-'A'+10;
else if(islower(src[i]))
t=src[i]-'a'+10;
else break;
if(t>=frombase)break;/*若需转换的所在位的数字大于或等于进制数则认为已经转换结束*/
for(j=0;j<cnt;j++)
{
if(j)dst[j]=(carry+=dst[j]*frombase)%tobase;
else dst[j]=(carry=dst[j]*frombase+t)%tobase;
carry/=tobase;/*这里要考虑溢出问题,写成
dst[j]=dst[j]*frombase+carry;
carry=dst[j]/tobase;
dst[j]%=tobase;
会出错。*/
}
while(carry)
{
dst[cnt++]=carry%tobase;
carry/=tobase;
}
}
for(i=0,j=cnt-1;i<=j;i++,j--)/*逆序并转化为字符*/
{
t=dst[i];
dst[i]=index[dst[j]];
dst[j]=index[t];
}
dst[cnt]=0;/*字符串结尾*/
return dst;
}
#define N 200
int main()
{
char dst[N],src[N];
int n1,n2;
while(~scanf("%s%d%d",src,&n1,&n2))/*输入原数、该数字的进制和需转换到的进制只支持非负整数的转换*/
{
puts(change(dst,src,n2,n1));
}
return 0;
}