算法竞赛入门经典(第二版) 例题4-4 信息编码(Message Decoding) UVa213 Finals1991 (二进制)

来源:互联网 发布:吉永小百合 长相 知乎 编辑:程序博客网 时间:2024/06/01 08:01

Page 83

题目描述:
UVa题目链接
题目分析:
①这道题主要考察二进制的东西,有了二进制,我们就不必以字符串的形式保存这一大串编码了,我们只需要把编码理解成二进制,用(len, value)这个二元数组来表示一个编码,其中len表示编码长度,value是编码对应的十进制值
②之后用codes[len][value]保存这个编码所对应的字符,这里需要需要注意我们是这里是单个字符输入的,而且我们编译头是独自一行的。我们这里为什么不考虑,getline因为我们需要每个字符输入和len有直接联系的,所以我们选择单个输入。
③处理比编码文本可以由多行组成这个问题,笔者编写了一个跨行编写读字符的代码
④进制转化问题了,二进制中8位最大的整数是2^8 - 1 用C写是(1 << 8)-1
⑤10进制转化为X进制
while(n != 0)
{
num[i] = n % x;
i++;
n = n/x;
}
X进制转为10进制
for(int i = 0;i < length; i++)
{
ans = ans * X + num[i];
}

========================================================================
参考代码:

//信息编码//2014.7.8#include<iostream>#include<string>using namespace std;int code[8][1 << 8];//由于编码文本可以多行int readchar(){    for( ; ; )    {        int ch = getchar();        //cin.get(ch);        if(ch != '\n' && ch != '\r')            return ch;    }}//二进制转为十进制int readint(int c) //将c位的二进制转化为十进制{    int v = 0;    while(c--)        v = v * 2 + readchar() - '0';    return v;}int readcodes(){    memset(code, 0, sizeof(code));    //code[1][0] = readchar();    for(int len = 1; len <= 7; len++)    {        for(int i = 0; i < (1 << len) - 1; i++) //不能全为1,也就是说以全为1结束        {            //int ch;            //cin.get(ch);            int ch = getchar();            if(ch == EOF)  //EOF指的是文件结束符                return 0;            if(ch == '\n' || ch == '\r') //\n指换行符 在windows下,以文本方式写入文件的\n会被转换为\r\n(也就是0x0D0A),而在读入的时候,\r\n会被转换回\n                return 1;            code[len][i] = ch;        }    }    return 1;}int main(){    while(readcodes()) //无法读取更多的编码头时退出    {        for( ; ; )        {            int len = readint(3); //每一小节的前3个数字表示小节中每个编码的长度            if(len == 0)                break;            for( ; ; )            {                int v = readint(len);                if(v == (1 << len) - 1) //每个字符的编码以全1结束                    break;                putchar(code[len][v]); //类似于查表的过程            }        }        putchar('\n');        }    return 0;}

调试易犯错误的地方:
以前我们知道C++少用getchar 这里可不可以用cin.get(ch),调试中证明是不可以的,因为我们这里ch定义的时候是整型,现在舒瑞虎用getchar返回的就是ASCII码了。


1 0