高校俱乐部编程挑战 进制转换。一个空格引发的悲剧

题目详情

我们通常用的十进制数包含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;
}    
点赞