UVA213 Message Descoding
#include <iostream> #include <string.h> char code[8][1 << 8], s[1 << 8]; using namespace std; // 过滤空行,返回字符串长度 int my_gets(char* s) { int k; //读入s列 while ((cin>>k) &&k== '\n'); // 空行重读 if (k == -1) k = 0; else gets(s + 1); s[0] = k; return strlen(s); } void init() { int i, j, k = 0; //将0,00,01.....与s列对应 for (i = 1;; i++) { for (j = 0; j < (1 << i) - 1; j++) //除去 全为0的结尾,i位01符对应有 (1<<i)-1个 { code[i][j] = s[k++]; //i即为编码长度 j为 001(01)在三(二)位编码中所排位数 等等 if (!s[k]) return; } } } // 读取01字符,返回0、1整型值 int read() { char ch; while ((ch = getchar()) == '\n'); return ch - '0'; } // 读取c个01字符 int readint(int c) { int v = 0; while (c--) v = (v << 1) + read(); // 读取len位二进制,转换为十进制。 return v; } int main() { int len, v; while (my_gets(s)) { init(); while (len = readint(3)) while ((v = readint(len)) != ((1 << len) - 1)) putchar(code[len][v]); putchar('\n'); } return 0; }
源码仿照网友写的。索性贴上来了。
i<<(>>)p:将i转换二进制,再向左(<<)或向右(>>)移动p位
i<<p=i*(2**p)