2011-7-5,实在是没什么效率。才做了3个字符串题目,两道题直接AC,接下来的一个,没受到之前的教训,看到数据没范围,还是傻乎乎的,用int,后果可想而知,测试结果一切OK,特么的,交上去WA,好像还有个float point error,浮点数据错误,大概就是个溢出错误。在老师的提醒下,才知道“大数问题”,于是,又开始修修改改。
不过看着 老师的代码,觉得那句话“不要以为AC了就OK了,还要看看别人的代码,还有没有更好代码”于是乎,在帮同学改正的时候才知道老师的代码是多少的简练。就拿2478来说:我要从0到len之间每一个数都考虑过考虑k==1,k>1还要刻意的进行K越过操作,而teacher的code一个循环(i=0;STR[i]!=’\0’;i++)就解决的,连LEN都不用算。受教了。
还有那个纠结我一个下午的1154其实用字符数组也有其好处,至少,SUM就简单了。再么就一个循环两个公式。求b的十进制数到是有点难度,还是拿2314做例子
(((2*8)+3)*8+1)*8+4)*8;如此,公式便为
for(j=0;j<len;j++)
{
SUM+=B[j]-'0';
b=b*a+B[j]-'0';
}
晚上室友同学来,大家去外面大排档买了点小酒小菜,在寝室里喝了几杯,也就没做什么,不过无所谓了,开心就好。
ZOJ 2172:
#include<stdio.h>//解决问题:字符串的读与输,二维数组
int main()
{
int N,j,i;
int m=0;
char name[15][30];
while(scanf("%d",&N)&&N)
{
m++;
for(i=0;i<N;i++)//这里 i 不能循环内定义,不然编译错误!
scanf("%s",name[i]);//输入
printf("SET %d\n",m);
for(i=0;i<N;i+=2)
printf("%s\n",name[i]);
if(N%2==0){ j=N-1;}
else {j=N-2;}
for(i=j;i>0;i-=2)
printf("%s\n",name[i]);
}
return 0;
}
ZOJ 2478:
#include<stdio.h>
#include<string.h>
int main()
{
int N;
int i,j,l,k=1;
char encoding[105];
scanf("%d",&N);
while(N--)
{
scanf("%s",encoding);
l=strlen(encoding);
for(i=0;i<l;i++)
{
for(j=i+1;j<l;j++)
{
if(encoding[i]==encoding[j])
k++;
if(encoding[i]!=encoding[j]) break;//防止把后面的相同间隔的字母读入。
}
if(k==1)//只有一个数的情况
{
printf("%c",encoding[i]);
}
else if(k>1)// 有 多个数的情况
{
printf("%d%c",k,encoding[i]);
i=i+k-1;//对 I 进行操作,越过相同的 字母。
}
k=1;
}printf("\n");
}
return 0;
}
ZOJ 1154
//Niven Numbers: a number in base b在B进制下,能被个数和整除。
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
int N;
long int a;//a 为进制,判断B是否 NIVEN number
int SUM=0,SUM1=0,i=0,b;
char B[500];
int len,j;
scanf("%d",&N);
while(N--)
{
while(scanf("%ld",&a)&&a)//问题1:程序只有在SUM>a 的情况下才起作用;问题2:b要用字符串处理,不然要超出其范围。所以说碰到没范围的数一定要考虑大数!!!
{
b=0;
scanf("%s",B);
len=strlen(B);
for(j=0;j<len;j++)
{
SUM+=B[j]-'0';
b=b*a+B[j]-'0';
} //问题3:原来是将SUM 转换为a进制,现在是将b转换为10进制
/*if(SUM>=a) //各位数之和大于A的情况,转换进制为A。
{
while(SUM)
{
SUM1+=(SUM%a)*pow(10,i);
SUM/=a;
i++;
}
}
else {SUM1=SUM;}*/
//printf("%d",SUM);
//if(SUM1==0) break;
if(b%SUM==0) {printf("yes\n");}//用字符串de话又怎么进行
else{printf("no\n");}
SUM=0;
i=0;
}
if(N) printf("\n");
}
return 0;
}