字符串3题

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; 

 

 

你可能感兴趣的:(c,测试,ini,float,encoding)