UVA213 信息解码(代码解析与感悟)-c

小紫书上的题目没给sample,有些难理解,在网上找到了题目。
UVA213题目

《《《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。<<的优先级低于+,所以要用括号括起来。
如图
‘’‘文章内容如有错误、纰漏,望指出。’‘’

 

转载于:https://www.cnblogs.com/ZackBee/p/6379541.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值