这一题对着原题,对着翻译,看了很久才明白意思。又对着示例手动算了一次。
通过本题,学习到的内容有:
1.注意这里for循环的妙用;
2,.注意输入函数的写法,尤其是其中的“if(ch != '\n' && ch != '\r') return ch;”
// UVa213 Message Decoding
// Rujia Liu
#include<stdio.h>
#include<string.h>
int readchar()
{//用来读取编码 ,并解决编码文本由多行组成的问题
for(;;) {
int ch = getchar();
if(ch != '\n' && ch != '\r') return ch;
}
}
int readint(int c)
{//用来读取C位二进制符,并转化为十进制整数
int v = 0;
while(c--) v = v * 2 + readchar() - '0';
return v;
}
int code[8][1<<8];
int readcodes()
{
memset(code, 0, sizeof(code));//先清空数组
code[1][0] = readchar();//第一行存放编码
for(int len = 2; len <= 7; len++)
{
for(int i = 0; i < (1<<len)-1; i++)
{
int ch = getchar();
if(ch == EOF) return 0;
if(ch == '\n' || ch == '\r') return 1;
code[len][i] = ch;
}
}
return 1;
}
int main()
{
while(readcodes())
{
//printcodes();
for(;;)
{
int len = readint(3);//看编码长度
if(len == 0) break;//即读入的三位是‘000’,代表编码结束
for(;;)
{
int v = readint(len);//将下一个相应编码长度的字符段代码转化为十进制
if(v == (1 << len)-1) break;//n<<x,将整型数n在内存中向左边移动x位
//当判断下一个编码长度小节全为1时,退出循环
putchar(code[len][v]);
}
}
putchar('\n');
}
return 0;
}