思路来自紫书。。。开始时的思路估计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=;
char letter[maxn][<<maxn]; char enterfilter()
{
for(;;)
{
char x=getchar();
if(x!='\n'&&x!='\r')return x;
}
}
int returnint(int x)
{
int ans=;
while(x--)
ans=ans*+enterfilter()-'';
return ans;
}
bool initmap()
{
memset(letter,,sizeof(letter));
letter[][]=enterfilter();/////to filter the line-break remained
if(letter[][]==EOF)return false;
for(int i=;i<=maxn;i++)
for(int j=;j<((<<i)-);j++)
{
char ch=getchar();
if(ch=='\n'||ch=='\r')return true;
letter[i][j]=ch;
}
}
int main()
{
while(initmap())
{
for(;;)
{
int len=returnint();
if(!len)break;
for(;;)
{
int x=returnint(len);
if(x==(<<len)-)break;
printf("%c",letter[len][x]);
}
}
printf("\n");
} return ;
}