题目详情
我们通常用的十进制数包含0-9十个数字。假设有一种进制系统包含3种数字,从低到高分别为”oF8”,那么从1到9分别表示为F, 8, Fo, FF, F8, 8o, 8F, 88, Foo, FoF。给定一种进制的数和两种进制的数字表,请把它从第一种进制转换为第二种进制。
输入格式:
第一行是T表示测测试数据组数。(0<T<=200)。
以后T行,每行有3个部分:
number number_table1 number_table2
其中number_table1和number_table2表示从第一种进制的数字表和第二种进制的数字表。(数字由低到高。)
number是第一种进制的一个数。
数字表可能包含的字符是数字0-9,还有 !”#$%&'()*+,-./:;<=>
[email protected][\]^_`{|}~ 等几种字符。
1<=number<=1000000000 (十进制)。
输出格式:
先输出Case #数目,再输出第二种进制下的数。 详见样例。
答题说明
输入样例
4
9 0123456789 oF8
Foo oF8 0123456789
13 0123456789abcdef 01
CODE O!CDE? A?JM!.
输出样例:
Case #1: Foo
Case #2: 9
Case #3: 10011
Case #4: JAM!
分析:
设格式为Num,A,B
A的长度就是它的进制位数。
B同理。
将A进制的Num数转为十进制,存到sum中。
再讲sum转为B进制。通过Code[]记录下B进制下的Num在各位上的位置。
再用LTable[Code[i]]输出B进制下的Num数。
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX 10000
int main(void)
{
int t;
int i,j,k=0;
int sum;
int Code[MAX];
int LNum,LTableA,LTableB;
char Num[MAX],TableA[MAX],TableB[MAX];
scanf("%d",&t);
while(t--)
{
sum=0;
scanf("%s%s%s",Num,TableA,TableB);
LNum=strlen(Num);
LTableA=strlen(TableA);
LTableB=strlen(TableB);
for(i=0;i<LNum;i++)
{
for(j=0;TableA[j];j++)
{
if(Num[i]==TableA[j])
{
sum=sum*LTableA+j;
}
}
}
for(i=0;sum;i++)
{
Code[i]=sum % LTableB;
sum=sum/LTableB;
}
printf("Case #%d: ",++k);
while(i--)
{
printf("%c",TableB[Code[i]]);
}
printf("\n");
}
return 0;
}