UVA【213】 Message Decoding

题目链接:UVA【213】 Message Decoding

题意:二进制遍历问题 每组输入给一个编码头 从头开始每个字符对应0 00 01 10 000 001 010 011 100 101 110 0000 0001……后面给一串数字 头三个数表示后面每次读取的长度 全为1时结束一组输入 头三个数为0时编码结束

输入样例:

TNM AEIOU
//对应 T-0 N-00 M-01  -10 A-000 E-001 I-010 O-011 U-100
001(编码长度为1)0(T)1(小节结束)011(编码长度为3)000(A)11
1(小节结束)010(编码长度为2)00(N)10( )01(M)11(小节结束)011(编码长度为3)001(E)1
11(小节结束)000(编码结束)

输出:

TAN ME
解题思路:主要卡在输入 这题输入主要要弄好换行 所以要一个一个字符录 不能getline C的话getchar() C++cin.get() 这里参考了别人思路 写了个新的readchar函数 一切搞定 其次还有二进制的转换问题 决定直接转换成下标 同时用新学的移位 1<< 很方便的处理编码长度 之后直接输出相应二进制对应的符号即可

用C++写的时候对于文件结束没处理好 后来用编码头第一个字符作为循环条件 应该不是最佳方案 不过好歹过了

代码如下:

#include 
   
   
    
    
#include 
    
    
     
     

using namespace std;

char code[8][1<<8];

char readchar()//重写单个字符读取函数 消除空行
{
    char ch;
    for(;;)
    {
        cin.get(ch);
        if(ch!='\n'&&ch!='\r') return ch;
    }
}

int readcodes()//读取编码头 同时作为循环终止的判断 开始时清空数组
{
    int i,j;
    char ch;
    for(i=2;i<8;i++)
        for(j=0;j<(1<
     
     
    
    
   
   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值