背景:这题我最开始自定义了五个函数,找了一晚上的错误,还是超时,最后我放弃了最开始的代码,全部另外写了,不过思路只变了一点点,使得代码更加简单,这样经过一小时的战斗,终于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;
}