背景:這題我最開始自定義了五個函數,找了一晚上的錯誤,還是超時,最後我放棄了最開始的代碼,全部另外寫了,不過思路只變了一點點,使得代碼更加簡單,這樣經過一小時的戰鬥,終於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;
}