UVA213 信息解码(代码解析与感悟)-c
小紫书上的题目没给sample,有些难理解,在网上找到了题目。
《《《UVA213信息解码原网页,点击进入》》》
编码以及01序列都类似二进制数,用数组code[len][value]的方式存储编码头,每一个len(编码的长度)与value(编码对应的十进制数)加上code数组元素的值组成的整体都是独一无二的。(代码部分参考了网络上以及小紫书,然后自己用c写出。0.0重点是注释)
by c:
#include<stdio.h>
#include<string.h>
#define leadnum 3 //编码文本的前三位代表长度;
int code[8][1<<8];
int readchar() //用于读取不为\n和\r的字符;
{
while(1){
int ch=getchar();
if(ch!='\n' && ch!='\r')
return ch;
}
}
int readcode() //用于读取编码头code;
{
memset(code,0,sizeof(code));
code[1][0]=readchar();
if(code[1][0]==EOF)
return 0; //如果输入为EOF,结束输入;
for(int len=2;len<=7;len++){
for(int i=0;i<(1<<len)-1;i++){//注意(1<<len)的括号;
int ch=getchar();
if(ch==EOF) //如果输入为EOF,结束输入;
return 0;
if(ch=='\n' || ch=='\r')//输入\n||\r代表编码头输入完成;
return 1;
code[len][i]=ch; //i代表的就是[len][value]中的value的值;
}
}
return 1;
}
int readint(int len) //用于将输入的二进制数转化为十进制(此方法同样适用
{ //将其他进制的数转换为十进制,只需略微改动细节;
int v=0;
while(len--)
v=2*v+readchar()-'0';
return v;
}
int main()
{
while(readcode()){
while(1){
int len=readint(leadnum);
if(len==0) //三位都为0表示编码结束;
break;
while(1){
int v=readint(len);
if(v==(1<<len)-1)//各位都为1表示小节的结束;
break;
putchar(code[len][v]);
//千万不要再在后面多加一个break;每个小节的末尾
//的111……就会退出循环
}
}
printf("\n");
}
return 0;
}
代码中用到了<<,代表移位,比如1《len,
就代表1的二进制表示向左移动len位,结果为1*2^len。<<的优先级低于+,所以要用括号括起来。
‘’‘文章内容如有错误、纰漏,望指出。’‘’