注意,我的代码和紫书代码不一样。
首先来说一下我的代码与紫书所给的代码的区别。
我的代码不是对编码头做处理,而是对编码信息(也就是二进制需解码的信息)进行处理,使其与编码头一一对应。
怎么说呢,我觉得我的代码有思考的过程,我觉得有必要写一下。
思路:例子:编码头:abcdefghijklmn
我希望达成的目的是编码头直接用字符串来储存,即code="abcdefghijklmn"
然后解码时,0对应code[0],00对应code[1]。即将编码信息转换为code的下标
我们会发现一个特点,编码信息每次多一位数时,其值会从0开始。
注意00前面有1个数(0),000前面有4个数,000前面有11个数。
如果我们把信息编码的值加上00...0前有几个数,那么最后的结果就和下标是一样的了。
那么00...0(n个0)前面有几个数呢?
我们先考虑00...0(n-1个)到11...1(n-1个)有几个数
即11...1的值加上1(00...0),也就是2^(n-1).
不过11...1不能算在其中,故应该是2^(n-1)-1
那么00...0(n个0)之前应该有
个数
故下标值=编码信息值(二进制要转换成十进制)+(n为编码信息长度)+
这样问题就解决了。
附上我的代码:
(这是我第一次写博客,有什么不好的地方欢迎大家指正)
#include <cstdio>
#include <cstring>
using namespace std;
char code[256];
int readchar()
{
while(1)
{
int ch=getchar();
if(ch!='\n'&&ch!='\r')
return ch;
}
}
int read_binary(int length)
{
int binary_buf=0;
while(length--)
binary_buf=binary_buf*2+readchar()-'0';
return binary_buf;
}
int main()
{
while(fflush(stdin),fgets(code,256,stdin))
{
if(code[0]=='\n'||code[0]=='\r')
continue;
int len,idx;
while(len=read_binary(3),len)
{
while(idx=read_binary(len),idx!=(1<<len)-1)
{
idx+=(1<<len)-len-1;
printf("%c",code[idx]);
}
}
printf("\n");
}
return 0;
}