UVa 213 Message Decoding 信息解码

题目大意:写一个解码程序,首先输入一个编码头,然后输入一串01序列,可跨行,序列内的每个子串都对应编码头的一个字符。

编码长度从1-7,用3位二进制数表示,000表示编码结束,序列中全为1的串为小节结束标志。

例如:编码头为$#**\,编码文本为0100000101101100011100101000,应该这样解码:010(编码长度为2)00(#)00(#)10(*)11(小节结束)011(编码长度为3)000(\)111(小节结束)001(编码长度为1)0($)1(小节结束)000(编码结束)

知识点:

1、移位运算符: 左移<<和右移>>

左移:1<<3 = 00000001左移3位,低位补0,高位舍弃,得00001000 = 2^3,即左移几位就是乘2的几次幂。

右移:同理,除以2的几次幂。

2、可以用二维数组来表示每个编码对应的字符code[len][value],len为编码长度,value为编码对应的十进制的值,数组的内容为编码头字符所对应的ASCII码。

3、getchar()和putchar()函数

getchar()函数:返回值为int类型,为用户输入的ASCII码和EOF。

putchar()函数:打印出来的是char类型的数据,参数可以是int类型,也可以是char类型。

这两个函数的存在意味着我们可以先用getchar来读取编码头转化成int类型,存于int二维数组中,打印的时候也只需要找到int数组中对应的编码头字符,用putchar直接转化为char类型打印出来。

4、跨行读字符函数,根据题目需要自行利用getchar来改造。

'\n' '\r'都是换行符。本题中编码头的第一个字符需要用readchar()来读取,因为在读取第二个编码头需要先把流中剩余的换行符读取掉。

5、读取二进制数并转化为十进制。

1101 = ((1*2+1)*2+0)*2+1 = 13

6、移位运算符的优先级小于加减运算符

1<

#include 
#include 
using namespace std;
int code[8][1 << 8];
/*跨行读字符*/
int readchar()
{
	for ( ;; )
	{
		int ch = getchar();
		if ( ch != '\n' && ch != '\r' ) return ch;
	}
}
/*二进制转十进制*/
int readint(int x)
{
	int v = 0;
	while(x--)
	{
		v = v * 2 + readchar() - '0';
	}
	return v;
}
/*读取编码头*/
int readcode()
{
	memset(code,0,sizeof(code));
	code[1][0] = readchar();
	for(int len = 2; len <= 7; len++)
	{
		for(int i = 0; i < (1<

 

你可能感兴趣的:(UVa)