题目
对于下面这个字符串:
0,00,01,10,000,001,010,011…….
首先是长度为1的串,然后是长度为2的串,以此类推。不存在全为1的串。
你的任务是编写一个程序。首先输入一个代码头(例如AB#TANCnrtXc),则上述序列的每个串依次对应编码头的每个字符。例如,0对应A,00对应B,01对应#…,0000对应c。接下来是编码文本(可能由多行组成,你应当把他们拼成一个长长的01串)。编码文本由多个小节组成,每个小节的前3个数字代表小节中每个编码的长度,用二进制表示,然后是个字符的编码,以全1结束。编码文本以000结束。
输入输出样例
输入
TNM AEIOU
0010101100011
1010001001110110011
11000
$#**\
0100000101101100011100101000
输出
TAN ME
##*\$
代码分析
#include<stdio.h>
#include<string.h>
int code[8][1<<8];
int readcodes(){//读取编码
memset(code,0,sizeof(code));
code[1][0]=readchar();
int len,i;
for(len=2;len<=7;len++){
for(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 readchar(){//读取字符
for(;;){
int ch=getchar();
if(ch!='\n'&&ch!='\r'){//跨行读字符
return 0;
}
}
}
int readint(int c){//将相应的二进制字符转化为十进制
int v=0;
while(c--){
v=v*2+readchar()-'0';
}
return v;
}
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;
}