进制转换

题目描述

编写程序,实现将一个数从一种进制转换到另一种进制。在这些进制中,可以出现的数码有62个:{0-9,A-Z,a-z}。

输入

输入文件的第1行是一个正整数N,表示测试数据的个数,接下来有N行,每行的格式为:输入数据的进制(用十进制表示),输出数据的进制(用十进制表示),最后一个是用输入数据的进制所表示的数。输入/输出数据的进制范围是2~62,也就是说A~Z相当于十进制中的10~35,a~z相当于十进制中的36~61。

输出

对每个测试数据,程序输出3行,第1行是输入数据的进制,空格,然后是在该进制下的输入数据;第2行是输出数据的进制,空格,然后是在该进制下的输出数据;第3行为空行。

样例输入 

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

样例输出

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

分析:

直接从a进制转换到b进制,a进制的那串字符串的十进制是:val=s[0]*a^0+s[1]*a^1+s[2]*a^2+……+s[n]*a^n,转到b进制后t[0]=val%b;t[1]=val/b%b,以此类推,以t[0]为例,t[0]=(s[0]*a^0+s[1]*a^1+s[2]*a^2+……+s[n]*a^n)%b,那么括号打开,然后代码里把s串反转后一层层的计算,先计算s[n]*a^n%b并将结果加到s[n-1]里,s[n]比s[n-1]多乘了一个a,所以s[n-1]要加s[n]%b*a,以此类推一直取模,直到最后字符串为0结束

ASCII码:

0:48     9:57

A:65    Z:90

a:97    z:122

样例输出

#include<stdio.h>
#include<string.h>
int main()
{
    int a,b,i,l,T,k,t[1000],A[1000];
    char s[1000],d[1000];
    for(scanf("%d",&T);T--;)
    {
        scanf("%d%d%s",&a,&b,s);
        for(k=i=strlen(s);0<i--;)
        {
            t[k-i-1]=s[i]-(s[i]<58?48:s[i]<97?55:61);
        }
        for(l=0;k;)
        {
            for(i=k;1<i--;)
            {
                t[i-1]+=t[i]%b*a;
                t[i]/=b;
            }
            A[l++]=t[0]%b;
            t[0]/=b;
            for(;0<k&&!t[k-1];k--);
        }
        for(d[l]=i=0;i<l;i++)
        {
            d[l-i-1]=A[i]+(A[i]<10?48:A[i]<36?55:61);
        }
        printf("%d %s\n%d %s\n\n",a,s,b,d);
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值