#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)