Message Decoding
Time Limit: Unknown Memory Limit: Unknown
Total Submission(s): Unknown Accepted Submission(s): Unknown
https://uva.onlinejudge.org/i...
Accepted Code
// Author : Weihao Long
// Created : 2017/12/23
#include "stdio.h"
#include "string.h"
int readchar();
int readcodes();
int readint(int c);
int code[8][1 << 8];
int main() {
while (readcodes()) { // 读取编码头
for (;;) {
int len = readint(3); // 读取编码长度
if (len == 0)
break;
for (;;) { // 解码
int v = readint(len);
if (v == (1 << len) - 1)
break;
putchar(code[len][v]);
}
}
putchar('\n');
}
return 0;
}
int readchar() {
for (;;) {
int ch = getchar();
if (ch != '\n' && ch != '\r')
return ch;
}
}
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;
}
}
}
int readint(int c) {
int v = 0;
while (c--)
v = v * 2 + readchar() - '0'; // 二进制转化成十进制
return v;
}
Notes
题意:
写一个解码程序:
输入一个编码头,每个字符依次对应 0,00,01,10,000,001,010... (详见题述)。
接下来输入编码文本(可能由多行组成,你应当把它们拼成一个长的 01 串)。
然后开始解码。
例如,编码头 $#**\ ,编码文本为 0100000101101100011100101000 ,应这样解码:
010(编码长度为2)00(#)00(#)10(*)11(小节结束)
011(编码长度为3)000(\)111(小节结束)
001(编码长度为1)0($)1(小节结束)
000(编码结束)
注解:
1. readchar() 函数的功能是“跨行读取字符”。
2. readcodes() 函数的功能是“读取每组数据的编码头”。
3. readint(int c) 函数的功能是“读取c位二进制字符,并转化为十进制整数”。
感受:
高深的二进制哎...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。