Message Decoding UVa213

 

 

codes:

#include<stdio.h>
#include<string.h> //using memset

int readchar() 
{
    char c;
    while(true)
    {
        c = getchar();
        if(c == '\n')continue;
        else break;
    }
    return (c-'0');
    
}

int readint(int c)
{
    int i = 0;
    int sum = 0;
    for(; i < c; i++)
    {
        sum = readchar()+ sum*2; 
    }
    return sum;

}

int code[8][1<<8];

int readcodes() 
{
    memset(code,0,sizeof(code));
    int i = 1;
    for(; i <= 8; i++)
        for(int j = 0; j < (1<<i)-1; j++)
        {
            char c = getchar();
            if(c == '\n') return 1;
            else    code[i][j] = c;
        }
}

int main()
{
    while(readcodes())
    {
        for(;;)
        {
            int len = readint(3);
            if(len == 0) break;           //if 000 break;
            for(;;)
            {
                int v = readint(len);
                if( v == (1 << len)-1) break;             //1000  is 111 + 1 
                putchar(code[len][v]);
            }
        }
        putchar('\n');
    }
    return 0;
}

 

  1.  虽然是二进制的,我们依旧可以用十进制来表示。
  2. 可以使用自定义的函数readchar()来读取除了回车之外的字符,用来应对跨行的情况。
  3. readint()为一个标准的二进制转换成十进制的函数,简洁而高效
  4. 关于二维数组code的大小应该以最大值加1为标准
  5. 使用readcodes()快速完成编码的初始化
  6. main()函数的代码十分简洁,需要注意的是两个if的作用。
  7. 最后不要忘掉putchar('\n');
posted @ 2018-08-10 16:06  ClarkQian  阅读(121)  评论(0编辑  收藏  举报