题目链接:https://vjudge.net/problem/UVA-213
解:这道题网上有很多解法,各有其巧妙之处,get到了很多知识点
1)用二维数组存储编码字符,code[编码长度][编码的十进制表示]
2)用左移来计算二进制,注意 1 << n - 1 等于 1 << (n - 1)
3) 采用getchar()读入编码
总的来说就是关于 二进制和十进制的转化和读入技巧
#include<bits/stdc++.h>
using namespace std;
char s[300],ch;
int sum,flag,q,num;
int main()
{
while(gets(s)) //读入编码字符
{
while(1)
{
sum = 0;
for(int i = 2; i >= 0;i--)
{
ch = getchar();
if(ch == '\n') i++;
else if(ch == '1') sum += pow(2,i);
} //sum存储前3位编码的十进制
if(!sum) break; //000时结束
else
{
flag = 0;
for(int i = 1;i <= sum - 1; ++i)
flag += (1 << i) - 1;
} //flag存储长度为sum - 1,sum - 2,...,1 的编码共有多少个
q = (1 << sum) - 1;
while(1)
{
num = 0;
for(int i = sum - 1; i >= 0; i--)
{
ch = getchar();
if(ch == '\n') i++; //跳过回车
else if(ch == '1') num += pow(2,i);
}
if(num == q) break; //全为1时结束
else printf("%c",s[flag + num]);
}
}
printf("\n");
while((ch = getchar()) != '\n' && ch != EOF);
//吃光缓冲区,为下一次的编码头输入做清空操作
}
return 0;
}