UVa213 Message Decoding

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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值