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;
}



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