uva213-优化算法【紫书例题】

注意,我的代码和紫书代码不一样。

首先来说一下我的代码与紫书所给的代码的区别。

我的代码不是对编码头做处理,而是对编码信息(也就是二进制需解码的信息)进行处理,使其与编码头一一对应。

怎么说呢,我觉得我的代码有思考的过程,我觉得有必要写一下。

思路:例子:编码头:abcdefghijklmn

我希望达成的目的是编码头直接用字符串来储存,即code="abcdefghijklmn"

然后解码时,0对应code[0],00对应code[1]。即将编码信息转换为code的下标uva213-优化算法【紫书例题】_第1张图片

我们会发现一个特点,编码信息每次多一位数时,其值会从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 
#include 

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<


你可能感兴趣的:(紫书例题)