问题描述:
https://uva.onlinejudge.org/local/online_judge/search_uva.html
问题分析:
<1>首先用字符数组存储编码头
<2> 0 00 01 10 000 001 010 011 100 101 110….分别对应编码头的第1个字符,第2个字符,第3个字符……所以读取一个文本后,此编码在编码头数组中对应的字符标号就很重要,考虑写一个position(int lens,int n)函数,lens代表编码文本长度,n代表编码文本对应的十进制数。
#include <stdio.h>
#include <string.h>
#define maxn 100
#define LOCAL
int pow(int n){ //返回2的n次方,n为自然数。
int a=1;
while(n>0){
a*=2;
n--;
}
return a;
}
int trans(int digit){ //读取一个digit位的二进制数并返回它的十进制值
int ret=0;
char c;
int t;
do{
digit--;
scanf("%c",&c);
if(c!='\n'&& c!='\r'){ //if语句解决跨行读取文本时的换行符问题
t=c-'0';
ret+=t*pow(digit);
}else{
digit++;
}
}while(digit>0);
return ret;
}
int position(int lens,int n){ //返回长度为lens,大小为n(十进制)在数组中的位置
int sum=0;
while(lens>=1){
lens--;
sum+=pow(lens)-1;
}
int position=sum+n+1;
return position;
}
int main(){
#ifdef LOCAL
freopen("p83in.txt","r",stdin);
freopen("p83out.txt","w",stdout);
#endif
char a[maxn];
while(gets(a)!=NULL){
while(int n=trans(3)){
int decimal=0;
do{
decimal=trans(n);
if(decimal!=pow(n)-1){
int i=position(n,decimal);
printf("%c",a[i-1]);
}
}while(decimal!=pow(n)-1);
}
}
return 0;
}