思路来自紫书。。。开始时的思路估计100行+,果断放弃!
关键:
1.正确提取出函数!
initmap():初始化字母与整数的映射。
returnint(x):向后读取x位,并转换为十进制数返回。
enterfilter():获取下个字符,跳过回车。
所以,
不断initmap()构建映射表直到结尾;
对于每组编码表,
使用returnint(x)一直读取并返回;
这其中又涉及到回车的干扰,所以使用enterfilter()。
2.逐个字符读取的应用。
其实还很方便啦~\(≧▽≦)/~。。之前有些畏惧心理~(害怕.jpg)
3.映射表的构建
使用(对应二进制码)长度与该长度下该字母的序数来定位,可以很方便使用
很好用!
4.二进制转十进制:乘二加下一位。。。并循环!
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=8; char letter[maxn][1<<maxn]; char enterfilter() { for(;;) { char x=getchar(); if(x!='\n'&&x!='\r')return x; } } int returnint(int x) { int ans=0; while(x--) ans=ans*2+enterfilter()-'0'; return ans; } bool initmap() { memset(letter,0,sizeof(letter)); letter[1][0]=enterfilter();/////to filter the line-break remained if(letter[1][0]==EOF)return false; for(int i=2;i<=maxn;i++) for(int j=0;j<((1<<i)-1);j++) { char ch=getchar(); if(ch=='\n'||ch=='\r')return true; letter[i][j]=ch; } } int main() { while(initmap()) { for(;;) { int len=returnint(3); if(!len)break; for(;;) { int x=returnint(len); if(x==(1<<len)-1)break; printf("%c",letter[len][x]); } } printf("\n"); } return 0; }