题目:
题目意思很简单,就是要求将一种进制的数转换为另外一种进制表示。题目中进制范围为2~62。当进制大于10时,数字的表示方式如下:A=10,B=11...,Z=35,a=36,b=37...,z=69。将十进制数转换为二进制的方法我们已经很熟了,就是将十进制数不断地对2取余除2,直到该十进制数为0,由每次获得的余数组成的数即为转换后的二进制数。其实将别的进制之间的转换方法相同。如将五进制数421,转换为十进制数的步骤如下:4除以10,不够除,于是用4*5+2=22除以10(跟十进制除法的形式类似),商上2,余2。再用2*5+1=11除以10,商上1,余1,这样第一次除可得到商21,余数1,类似地再用商21做第二次除法,商为1,余数为1,类似第三次,商为0,余数为1.这样就可以得到转换后的十进制数为111。
my code:
#include<iostream> using namespace std; const int size=500; char inda[size],outda[size]; int indata[size],t,ans[2*size],lans,ddd[size]; int main() { int i,j,test,inbase,outbase,la,ld,lm; int map[300];char rmap[65]; for(i='A';i<='Z';i++) {map[i]=i-'A'+10;rmap[i-'A'+10]=i;}//建立起进制的数字和字符之间的对应关系
for(i='a';i<='z';i++) {map[i]=i-'a'+36;rmap[i-'a'+36]=i;} for(i='0';i<='9';i++) {map[i]=i-'0';rmap[i-'0']=i;} cin>>test; while(test--) { cin>>inbase>>outbase>>inda; cout<<inbase<<" "<<inda<<endl; la=strlen(inda);lans=0;ld=0;lm=0; for(i=0;i<la;i++) indata[i]=map[inda[i]]; while(true) { if(la==1&&indata[0]<outbase){ans[lans++]=indata[0];break;} for(i=0;i<la-1;i++)//作除法,取余
{ ddd[ld++]=indata[i]/outbase; t=indata[i]%outbase; indata[i+1]+=t*inbase; } ddd[ld++]=indata[i]/outbase;//记录下商
ans[lans++]=indata[i]%outbase;//余数记录在转换结果中
for(i=0;i<ld;i++)//去掉商的前缀0
if(ddd[i]) break; for(j=0;i<ld;i++,j++)//将商作为下次的除数
indata[j]=ddd[i]; la=j;ld=0;//除数的长度
} for(i=0;i<lans;i++)//将各数位的数字对应成相应进制的字符表示
outda[i]=rmap[ans[i]]; outda[i]='\0'; cout<<outbase<<" "; for(i=lans-1;i>=0;i--)cout<<outda[i]; cout<<endl<<endl; } return 0; }
/*
sample input
8 62 2 abcdefghiz 10 16 1234567890123456789012345678901234567890 16 35 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2 35 23 333YMHOUE8JPLT7OX6K9FYCQ8A 23 49 946B9AA02MI37E3D3MMJ4G7BL2F05 49 61 1VbDkSIMJL3JjRgAdlUfcaWj 61 5 dl9MDSWqwHjDnToKcsWE1S 5 10 42104444441001414401221302402201233340311104212022133030
sample output
62 abcdefghiz 2 11011100000100010111110010010110011111001001100011010010001
10 1234567890123456789012345678901234567890 16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2 35 333YMHOUE8JPLT7OX6K9FYCQ8A
35 333YMHOUE8JPLT7OX6K9FYCQ8A 23 946B9AA02MI37E3D3MMJ4G7BL2F05
23 946B9AA02MI37E3D3MMJ4G7BL2F05 49 1VbDkSIMJL3JjRgAdlUfcaWj
49 1VbDkSIMJL3JjRgAdlUfcaWj 61 dl9MDSWqwHjDnToKcsWE1S
61 dl9MDSWqwHjDnToKcsWE1S 5 42104444441001414401221302402201233340311104212022133030
5 42104444441001414401221302402201233340311104212022133030 10 1234567890123456789012345678901234567890
*/
|
阅读(1833) | 评论(0) | 转发(0) |