#include //阅读材料:https://blog.csdn.net/mrcrack/article/details/52122765 /** * C语言中1<二进制->转十进制--> 256 这挺会玩啊~这么做也对,因为既然要把这道题考虑成二进制, // 那么出现的组合个数按左移N位来思考,也是正常的 //读取一个有用字符,小函数,辅助函数 int readchar() { char ch; while (true) { //读啊读~回车换行符不要, ch = getchar(); if (ch != '\r' && ch != '\n') return ch; } } //读取代码 int readcodes() { int len; int i; char ch; //清空codes数组,初始化为0 memset(codes, 0, sizeof(codes)); //读入第一个非换行的字符 codes[1][0] = readchar(); //从第2个开始,使用getchar进行读取 for (len = 2; len <= 7; len++) //7是极限,表示不会超过7位二进制 //第一轮次,读取字符 for (i = 0; i < (1 << len) - 1; i++) { ch = getchar(); //结束就不用继续了~ if (ch == EOF) return 0; //如果是换行符,就继续下一轮 if (ch == '\n') return 1; //读取到指定位置 codes[len][i] = ch; } return 1; } //读取二进制数字,转为十进制数,比如读取c=3个长度,封装成十进制数 int readint(int c) { int v = 0; while (c--) { v = v * 2 + readchar() - '0'; } return v; } int main() { int len; int i; //读取代码,不断的读取测试用例 while (readcodes()) { //在一个用例中开始进行分析 while (true) { len = readint(3); if (len == 0) break; while (true) { i = readint(len); if (i == (1 << len) - 1) break; putchar(codes[len][i]); } } putchar('\n'); } return 0; }