UVA 213 Message Decoding

先用二维数组把编码存进来

比如:TNM AEIOU
code[1][0]=T
code[2][0]=N code[2][1]=M code[2][2]=
code[3][0]=A code[3][1]=E code[3][2]=I code[3][3]=O code[3][4]=U

然后再读入2#换算后求得len(编码长度)和v(2#->10#)输出

code[len][v]。

#include "stdio.h"
#include "string.h"
int code[8][1<<8];
int readchar()//跨行读取字符的函数
{
    for(;;)
    {
        int ch=getchar();
        if(ch!='\n'&&ch!='\r')//一直读到非换行符为止
            return ch;
    }
}
int readcodes()//读取编码
{
    memset(code,0,sizeof(code));
    code[1][0]=readchar();//直接调到下一行开始读取,如果输入已经结束,会读到EOF
    for(int len=2;len<=7;len++)
    {
        for(int i=0;i<(1<<len)-1;i++)//len=2,i=0,i<2^2-1=3,i=1,2
        {
            int ch=getchar();
            if(ch==EOF)
                return 0;
            if(ch=='\n'||ch=='\r')
                return 1;
            code[len][i]=ch;//存储字符
        }
    }
    return 1;
}

int readint(int c)//读取2进制字符01010,并转化为10进制
{
    int v=0;
    while(c--)
    {
        v=v*2+readchar()-'0';
    }
    return v;
}

void printcodes()
{
    for(int len=1;len<=7;len++)
    {
        for(int i=0;i<(1<<len)-1;i++)
        {
            if(code[len][i]==0)//编码头已经结束
                return;
            printf("code[%d][%d]=%c\n",len,i,code[len][i]);
        }
    }
}
int main()
{
    while(readcodes())//无法读取更多编码头时退出
    {
//        printcodes();
        for(;;)
        {
            int len=readint(3);//前三个为编码长度,读入并计算
            if(len==0)
                break;//编码结束000
//            printf("len=%d\n",len);
            for(;;)
            {
                int v=readint(len);//v是长度为len的2#串对应的10#值,每次读入len长的数并计算为10#
//                printf("v=%d\n",v);
                if(v==(1<<len)-1)//如果len=2,2^2-1=3即11(2#)表示小节结束
                    break;
                putchar(code[len][v]);
            }
        }
        putchar('\n');
    }
    return 0;
}

 

posted @ 2019-01-23 13:45  付玬熙  阅读(125)  评论(0编辑  收藏  举报