信息解码

 需要了解<<运算符,它的意思就相当于*2,比如1<<1是2^1,1<<4是2^4

逐步分析这道题:

首先编码0,00,01,10......0000....用这些编码顺序代表编码头的字符,我们可以看到不同的编码长度能存放不同的编码数量,我们可以用一个二维数组保存它们,行数代表着编码长度,列数代表着该长度下保存的字符,比如长度为3,a[3][0]就代表着长度为三编码为000的字符,因此我们可以写一个函数来读取编码头并保存它

int code[9][(1 << 8) - 1];
//读取编码头函数
int readhead()
{
    memset(code, 0, sizeof(code));
    char ch;
    for (int i = 1; i <= 8; i++)
    {
        for (int j = 0; j < (1 << i) - 1; j++)
        {
            ch = getchar();
            if (ch == EOF) return 0;
            if (ch == '\n' || ch == '\r') return 1;
            code[i][j] = ch;
        }
    }
}

在读取编码时候注意,因为给出的输入时分行的所以在输入的时候直接用getchar(),会把不必要的换行符读取进来,所以需要重新修改一下输入方式

//读取字符函数
char readchar()
{
    char ch;
    while (ch = getchar())
    {
        if (ch != '\n' && ch != '\r') return ch;//因为输入是有换行的所以要把换行符移去
    }
}

 

保存好之后,就该去读取编码文本,首先要读取三个二进制数,判断它的编码长度,确定好编码长度就可以开始读取编码,在这个过程中将二进制全部转换为十进制,因此每读取一个编码长读的二进制为一个周期,比如编码长度为3,那么接下来读取二进制数就应该将接下来的三位二进制转换为十进制,知道读取到的编码是二进制位都为1,这个可以用(1<<len)-1来确定,这个过程还需要一个将二进制转换为十进制的函数

//将输入的长度为a的二进制,转换为十进制
int readint(int a)
{
    int sum = 0;
    while (a--)
    {
        sum = sum * 2 + readchar() - '0';
    }
    return sum;
}
            while (true)
            {
                //然后读取字符编码
                int value;
                value = readint(len);
                if (value == (1 << len) - 1)
                    break;
                else
                    putchar(code[len][value]);
            }

至此该题需要的函数功能已经实现,接下来就是主体部分,代码如下:

#include<stdio.h>
#include<string.h>
//读取字符函数
char readchar()
{
    char ch;
    while (ch = getchar())
    {
        if (ch != '\n' && ch != '\r') return ch;//因为输入是有换行的所以要把换行符移去
    }
}

//将输入的长度为a的二进制,转换为十进制
int readint(int a)
{
    int sum = 0;
    while (a--)
    {
        sum = sum * 2 + readchar() - '0';
    }
    return sum;
}
int code[9][(1 << 8) - 1];
//读取编码头函数
int readhead()
{
    memset(code, 0, sizeof(code));
    char ch;
    for (int i = 1; i <= 8; i++)
    {
        for (int j = 0; j < (1 << i) - 1; j++)
        {
            ch = getchar();
            if (ch == EOF) return 0;
            if (ch == '\n' || ch == '\r') return 1;
            code[i][j] = ch;
        }
    }
}


int  main(void)
{
    while (readhead())
    {
        char ch;

        while (true)
        {
            //先读取编码长度
            int len;
            len = readint(3);
            if (len == 0)
            {
                getchar(); break;
            }
            while (true)
            {
                //然后读取字符编码
                int value;
                value = readint(len);
                if (value == (1 << len) - 1)
                    break;
                else
                    putchar(code[len][value]);
            }
        }
        putchar('\n');

    }
    return 0;
}

 

posted @ 2021-01-27 14:11  loliconsk  阅读(195)  评论(0)    收藏  举报