Message Decoding UVa213
codes:
#include<stdio.h> #include<string.h> //using memset int readchar() { char c; while(true) { c = getchar(); if(c == '\n')continue; else break; } return (c-'0'); } int readint(int c) { int i = 0; int sum = 0; for(; i < c; i++) { sum = readchar()+ sum*2; } return sum; } int code[8][1<<8]; int readcodes() { memset(code,0,sizeof(code)); int i = 1; for(; i <= 8; i++) for(int j = 0; j < (1<<i)-1; j++) { char c = getchar(); if(c == '\n') return 1; else code[i][j] = c; } } int main() { while(readcodes()) { for(;;) { int len = readint(3); if(len == 0) break; //if 000 break; for(;;) { int v = readint(len); if( v == (1 << len)-1) break; //1000 is 111 + 1 putchar(code[len][v]); } } putchar('\n'); } return 0; }
- 虽然是二进制的,我们依旧可以用十进制来表示。
- 可以使用自定义的函数readchar()来读取除了回车之外的字符,用来应对跨行的情况。
- readint()为一个标准的二进制转换成十进制的函数,简洁而高效
- 关于二维数组code的大小应该以最大值加1为标准
- 使用readcodes()快速完成编码的初始化
- main()函数的代码十分简洁,需要注意的是两个if的作用。
- 最后不要忘掉putchar('\n');
Do not let your ego get in you way!