题目链接: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<