UVA 512_Message Decoding

题目就不放上来了,题目意思是说,先给你一个编码头,然后再给你一个01串作为编码文本,编码头每个字母都对应二进制里面的数字,然后01串的开头三个是读取的长度,后面开始读取,如果遇到长度里面都是1的,就结束,再读取后面三位,以三个0结尾。

刚开始本来想着一次性输入编码头,然后再读入01串,因为01串的长度和段数都不确定,所以要接在第一个01串后面凑成一长串,方面读取,但是,后来RE了。后来看紫薯上面的代码,发现要一个一个的读取,对于编码头的读取,则是每次读取一个编码头,就放到一个二维数组里面去,横向指编码头对应的01串的长度,纵向指编码头对应的01串转换成十进制的值。而编码文本的读取,也是一个一个读取,然后再根据要求转换成十进制。

下面的代码是根据紫薯上面的代码敲出来的,放这里作为以后不间断读取01串的样板,还有逐个读取的样板。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
char s[8][1<<8];
int readchar()    //实现跨行输入 
{
    while(1)
    {
        char ch=getchar();
        if(ch!='\n')  return ch;
    }
}
int readcode()
{
    memset(s,0,sizeof(s));
    s[1][0]=readchar();    //一个一个字符的读入,然后顺便按照需要的格式存入数组里面去 
    for(int i=2;i<=7;i++)
    {
        for(int j=0;j<(1<<i)-1;j++)
        {
            char ch=getchar();
            if(ch==EOF)  return 0;
            if(ch=='\n') return 1;
            s[i][j]=ch;
        }
    } 
    return 1;
}
int readint(int c)    //将二进制转换成十进制 
{
    int k=0;
    while(c--)  k=k*2+readchar()-'0'; 
    return k;
}
int main()
{
    while(readcode())
    {
        while(1)
        {
            int len=readint(3);    //计算长度 
            if(!len)  break;
            while(1)
            {
                int ll=readint(len);  //读取对应的二进制,转换成十进制,再对应数组输出相应的字符 
                if(ll==(1<<len)-1)  break;
                putchar(s[len][ll]);
            }
        }
        putchar('\n');
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值