UVa213

来源:互联网 发布:mac怎么重命名文件 编辑:程序博客网 时间:2024/06/12 19:35

问题描述:
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 LOCALint 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;} 
0 0
原创粉丝点击