Chinaunix首页 | 论坛 | 博客
  • 博客访问: 445283
  • 博文数量: 98
  • 博客积分: 6011
  • 博客等级: 准将
  • 技术积分: 1030
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-23 13:19
文章分类

全部博文(98)

文章存档

2011年(2)

2009年(2)

2008年(31)

2007年(35)

2006年(28)

我的朋友

分类:

2008-07-06 23:18:19

题目:
题目意思很简单,就是要求将一种进制的数转换为另外一种进制表示。题目中进制范围为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

*/

阅读(1790) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~