题目描述
编写程序,实现将一个数从一种进制转换到另一种进制。在这些进制中,可以出现的数码有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);
}
}