MessageDecodingUVa213 紫书例题4—4

#include<stdio.h>
#include<string.h>
#include<math.h>
#define Maxn 100000
char ch[Maxn];
int Sequence[100000];
int Binary[8][10000];
int k = 0;

int readint(int n){
     int sum = 0;
     int k;
     char cha;
          while(n&&(cha = getchar())!=EOF){
             if(cha!='\r'&&cha!='\n'){
                n--;
                k = cha-'0';
                sum = sum+k*(int)pow(2,n);
             }
          }
          return sum;
}

int main()
{
      F:if(k>0) getchar();
      while(gets(ch)){
      int len=0 , XiaBiao=0 , X=0;
      int Figure = 0, num = 0;
      memset(Sequence,-1,sizeof(Sequence));
      memset(Binary, -1 ,sizeof(Binary));
      re: len = readint(3);
      if(len == 0) {
            for(int i = 0 ; Sequence[i]!=-1;i++){
                 printf("%c",ch[Sequence[i]]);
            }
            printf("\n");
            k = 1;
            goto F;
      }
      for(int i = 0; ;){
           X = readint(len);
           if(X!=pow(2,len)-1){
                Binary[len][i] = X;
                XiaBiao = pow(2,len) -1 - len + Binary[len][i];        //等比公式
                Sequence[num] = XiaBiao;
                num++;
                i++;
           }
           if(X==pow(2,len)-1){
               goto re;
           }
      }
    }
}



/*
     1.设置 int len, XiaBiao,  分别表示二进制长度,最后的输出下标

     2.读取一行字符串 char ch[100000];  读取二进制数int Binary[8][100000]; 行表示二进制数长度,数组内存储对应的
        十进制数。并在存储时,将计算好的下标存储在Sequence中。(核心)
        问题:1.如何读取一行字符串?
        解决方法:gets,fgets 在使用中仍有读取多余空格字符的情况,需要注意。

     关于字符串:
                            问题:1.如何将字符与相应的编码对应,因为不同长度的二进制可能会代表
                                       相同的十进制数字
                            解决办法:利用等比求和公式,求出对应下标XiaBiao。

     关于二进制数的存储:
                             问题:1.如何将二进制数输入的长度与其字段还有末尾的结束字段分开存储
                             解决办法:1.首先的三个字符为接下来的编码分段长度,且将首先的三个字符转换为十进制并存储(len)
                                              2.按len将二进制转换为十进制存储
                                              3.遇到len长度的连续1即pow(2,len) - 1 的十进制时停止

      3.将字符串与二进制数对应:
                             输出ch[Sequence[i]];


*/

/*
                      注意:1.sizeof(buffer)给出的字节数
                            2.memset()只能赋值初始化0或者-1;
                      致命逻辑bug:字符串与二进制数不一定按从大到小的数据对应。(致命,导致差点要推翻重写)

心得:1.做题的时候现把思路想出来,写完思路和问题,发现问题无法解决的时候再从书上找到相应的解决思路

          2.相信自己能够做出来。其实这道题的代码真的不难,但是因为自己老是想着书上看着的那一点代码,觉得不懂很难,就会拖累自己做题的信心,导致写的时候整个人就不集中,很没有效率

          3.平常做题的时候要培养自己独立思考的能力,一定要自己能写的就不看答案,最后自己的写完了再看哪里可以进行优化

          4.其实我思路挺好的,虽然不像刘神一样极度简洁,但是应该可读性是非常高的,希望能够帮助别人阅读。在做题的过程中遇到难点我也尽力在网络上进行总结后记录下来,既让自己的知识点有所梳理,也让更多跟我和我做题时有一样的困惑的朋友,能够通过网络上乐于分享的人分享的文章解惑。在此非常感谢网络上大神大牛们的分享(差点打成大婶大牛O(∩_∩)O)




猜你喜欢

转载自blog.csdn.net/m0_37632283/article/details/80588072