1自定义函数的使用,可以让代码更清晰条理有效
2“跨行读取字符”的函数,本题中的readchar()
3本题主要在于二进制数的转换,用到了位移字符<<,(1<<i)是指2的i次方,可以巧妙利用这个,来将十进制转为二进制数;二进制数到十进制,可以每一位数乘以2的相应地次方就可以。
4在合适的地方用某些输出函数或者输出语句,来输出一些关键信息检测函数运行情况,如代码中注释掉的地方。
5memst(数组名,0,sizeof(数组名)),其头文件为<string.h>,要及时清空数组。
题目中没有说给几组数据,则将”scanf()==n“换为考虑EOF退出的情况(if(a==EOF) return 0;)
6将字符以ascii码的形式存于int数组中,然后用putchar读出原来的字符形式。
把编码理解成二进制的形式,也是本题主要的难点,巧用数组code[len][v],len代表长度,v代表二进制转换为十进制后的数的大小,用于区别其他数作为一个位置标志。
7关于字符和字符数组的知识还需要再看一看,比如getchar,putchar等的使用,还有怎样从文件中读取和输入字符等(即使这道题没用上)。
本题先是看书上的思路,具体细节自己实现,再然后对照着书上代码DEBUG并且做优化和考虑为什么。
书上代码思路更清晰,而且考虑的更为细致,但是自己需要想得更多,而不是依靠书上的代码,不然做出来也没怎么有成就感(每道题拖的时间不宜过长,否则很快失去兴奋感),甚至DEBUG的时候也不上心。
代码:
#include <stdio.h>
#include <string.h>
int code[8][1 << 8];
int readchar()
{
for (;;)
{
int a = getchar();
if (a != '\n'&& a != '\r')
return a;
}
}
int readcodes()
{
memset(code, 0, sizeof(code));
int a;
code[1][0] = readchar();
for (int i = 2; i <= 7; i++)
{
for (int j = 0; j < (1 << i) - 1; j++)
{
a = getchar();
if (a == EOF)
return 0;
if (a == '\n' || a == '\r')
return 1;
code[i][j] = a;
}
}
}
int readint(int number)
{
int shun = 0;
while (number--)
shun = shun * 2 + readchar() - '0';
return shun;
}
void printcodes()
{
for (int i = 0; i <= 8; i++)
{
for (int j = 0; j<(1 << i) - 1; j++)
{
if (code[i][j] == 0)
return;
printf("code[%d][%d]=%c\n", i, j, code[i][j]);
}
}
}
int main()
{
while (readcodes())
{
// printcodes();
while (1)
{
int len = readint(3);
if (len == 0)
break;
// printf("len=%d\n", len);
while (1)
{
int v = readint(len);
// printf("v=%d\n", v);
if (v == (1 << len) - 1)
break;
putchar(code[len][v]);
}
}
putchar('\n');
}
return 0;
}