uva213信息解码

背景:这题我最开始自定义了五个函数,找了一晚上的错误,还是超时,最后我放弃了最开始的代码,全部另外写了,不过思路只变了一点点,使得代码更加简单,这样经过一小时的战斗,终于ac了,好高兴。

学习:gets()函数读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF或发生错误,返回NULL指针,所以这个题可以直接用gets()函数输入,而不用定义一个自定义函数,还有scanf("%1d",&a);这个语句是代表输入一位整数。

思路:这题思路题给得已经很清晰,就不再说了。下面附一直超时的代码。


#include <stdio.h>
#include <string.h>
#include <math.h>
char text[10000],head[300];
int Gets(void)
{
    char ch;
    for(int i=0;(ch=getchar())!=EOF&&ch!='\n';i++)
        head[i]=ch;
    if(ch==EOF) return 0;
    else return 1;
}
int change(int i,int n)
{
    int sum=0;
    for(int k=0;k<n;k++,i++)
    {
        int m=text[i]-48;
        sum=sum+m*(int)pow(2.0,(double)(n-k-1));
    }
    return sum;
}
int isend(int i,int n)
{
    if(change(i,n)==((int)pow(2.0,(double)n)-1)) return 1;
    return 0;
}
int figure(int i,int n)
{
    return change(i,n)+(int)pow(2.0,(double)n)-1-n;
}
int main(void)
{
    while(Gets())
    {
        char text1[1000];
        scanf("%s",text);
        int m=strlen(text);
        for(int i=0;i<m;)
        {
            int n=change(i,3),k,ok=0;
            if(n==0) {printf("\n");break;}
            for(k=i+3;k<m;k+=n)
            {
                if(m-k-1<n)
                {
                    scanf("%s",text1);
                    strcat(text,text1);
                    m=strlen(text);
                }
                if(m-k-1>=n)
                {
                    if(isend(k,n)) {i=k+n;break;}
                    if(!isend(k,n))
                    {
                        int num=figure(k,n);
                        printf("%c",head[num]);
                    }
                }
            }
            if(ok) break;
        }
        getchar();
    }
    return 0;
}
然后是ac过的代码

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
char text[300],c;
int len,sum;
void print()
{
    for(int i=sum=0;i<len;++i)
    {
        do scanf("%c", &c);while (!isdigit (c));   /*除去输入是换行符的情况*/
        sum=sum*2+(c-'0');
    }
    if(sum>=((int)pow(2.0,(double)len)-1)) return;
    else
    {
        sum=sum+(int)pow(2.0,(double)len)-1-len;
        printf("%c",text[sum]);
        print();
    }
}
int main()
{
    int l1,l2,l3;
    while (gets(text)!= NULL)
    {
        if (!text[0]) continue;
        while(scanf("%1d%1d%1d",&l1,&l2,&l3),len=4*l1+2*l2+l3)/*注意scanf("%1d",&l1);表示的是输入一位整数l1*/
            print();
        printf("\n");
    }
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章