紫书章四 例题4——UVA 213 Message Decodeing

题意,开始会有一串字符,是按照我们的二进制编码来的,如
TNM AEIOU
0010101100011
1010001001110110011
11000

然后T 对应的就是0, N对应的就是00,M 对应 01 ,‘ ’对应的是10,A 对应的是000以下类推
然后下面会出现一串编码,前三个数字代表len的长度
如:
001 表示长度为1,然后后面0 ,1(遇到(1<

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int M[10][1<<9]//因为一开始我们的字符串中的每一个字符都代表着一个二进制数,所以将它们存进一个数组里更方便,M[二进制的长度][二进制代表的值];
int read()
{
    for(;;)
    {
        int c=getchar();
        if(c!='\n'&&c!='\r') return c;
    }
}
int readcode()
{
    memset(M,0,sizeof(M));
    M[1][0]=read();//读入第一个有效字符
    for(int i=2;i<=7;i++)
        for(int j=0;j<(1<<i)-1;j++)
        {
            int c=getchar();
            if(c=='\n'||c=='\r') return 1;
            if(c==EOF) return 0;
            M[i][j]=c;
        }
    return 1;
}
int read1(int len)//得到二进制的值
{
    int d=0;
    while(len--)
    {
        d=d*2+read()-'0';
    }
    return d;
}
int main()
{
    while(readcode())
    {
        for(;;)//无条件循环
        {
            int len=read1(3);
            if(len==0)
                break;
            for(;;)
            {
                int a=read1(len);
                if(a==(1<<len)-1) break;
                printf("%c",M[len][a]);
            }
        }
        printf("\n");
    }
    return 0;
}

像什么<<,二进制的运算一定要打括号啊啊啊啊。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值