ACM题库~

P1553 数字反转(升级版)

2019-03-31  本文已影响12人  mokoGoGoGo

本来这个题目很简单的,就是情况要考虑细致,比如0,0.0,0/1,0%,100.001,100/100等,这些的反转都可以很简单实现出来,具体我就不讨论了。

但是我做这道题的时候我遇到一个问题,就是在本地测试完全没有任何问题,但是提交到OJ上的时候却会出现RE或者WA(当然不是我的思路啊或者代码有什么问题),后来经我反复思考,觉得问题出在我使用了scanf("%c",&xxx[]);来读取字符串,具体造成RE的原因还没弄懂,之后弄懂了再更新在文章下面。

解决方法:我将原本的读取方式换成gets(xxx);数据就全部A了。

代码贴在下面:

#include <stdio.h>
#include <string.h>
/*********************************
*这个是我后来修改通过的代码
**********************************/
int main(){
    char data[100]={0};
    int i=0,flag=0,symbol,j;
    gets(data);
    while(i<strlen(data)){
        if(data[i]>'9'||data[i]<'0'){
            symbol=i;
            switch(data[i]){
                case '.':flag=1;break;
                case '/':flag=2;break;
                case '%':flag=3;break;
            }
        }
        i++;
    }
    int len=i-1;
    if(0==flag){
        for(j=len;j>0&&(data[j]=='0');j--);
        if(j>=0){
            while(j>=0){
                printf("%c",data[j]);
                j--;
            }
        }else{printf("0");}
    }
    else if(1==flag){
        for(j=symbol-1;j>0&&data[j]=='0';j--);
        if(j>=0){
            while(j>=0){
                printf("%c",data[j]);
                j--;
            }
        }else{printf("0");}
        printf(".");
        for(j=symbol+1;j<len&&data[j]=='0';j++);
        if(j<=len){
            int k=len;
            while(k>=j){
                printf("%c",data[k]);
                k--;
            }
        }else{printf("0");}
    }
    else if(2==flag){
        for(j=symbol-1;j>0&&data[j]=='0';j--);
        if(j>=0){
            while(j>=0){
                printf("%c",data[j]);
                j--;
            }
        }else{printf("0");}
        printf("/");
        for(j=len;j>symbol+1&&data[j]=='0';j--);
        if(j>=symbol+1){
            while(j>=symbol+1){
                printf("%c",data[j]);
                j--;
            }
        }else{printf("0");}
    }else if(3==flag){
        for(j=symbol-1;j>0&&data[j]=='0';j--);
        if(j>=0){
            while(j>=0){
                printf("%c",data[j]);
                j--;
            }
        }else{printf("0");}
        printf("%%");
    }
    return 0;
}

错误的版本:

#include <stdio.h>
/*********************************
*这个是RE的代码,使用了scanf读取字符串
**********************************/
int main(){
    char data[100]={0};
    int i=0,flag=0,symbol,j;
    while(scanf("%c",&data[i]),data[i]!='\n'){
        if(data[i]>'9'||data[i]<'0'){
            symbol=i;
            switch(data[i]){
                case '.':flag=1;break;
                case '/':flag=2;break;
                case '%':flag=3;break;
            }
        }
        i++;
    }
    int len=i-1;
    if(0==flag){
        for(j=len;j>0&&(data[j]=='0');j--);
        if(j>=0){
            while(j>=0){
                printf("%c",data[j]);
                j--;
            }
        }else{printf("0");}
    }
    else if(1==flag){
        for(j=symbol-1;j>0&&data[j]=='0';j--);
        if(j>=0){
            while(j>=0){
                printf("%c",data[j]);
                j--;
            }
        }else{printf("0");}
        printf(".");
        for(j=symbol+1;j<len&&data[j]=='0';j++);
        if(j<=len){
            int k=len;
            while(k>=j){
                printf("%c",data[k]);
                k--;
            }
        }else{printf("0");}
    }
    else if(2==flag){
        for(j=symbol-1;j>0&&data[j]=='0';j--);
        if(j>=0){
            while(j>=0){
                printf("%c",data[j]);
                j--;
            }
        }else{printf("0");}
        printf("/");
        for(j=len;j>symbol+1&&data[j]=='0';j--);
        if(j>=symbol+1){
            while(j>=symbol+1){
                printf("%c",data[j]);
                j--;
            }
        }else{printf("0");}
    }else if(3==flag){
        for(j=symbol-1;j>0&&data[j]=='0';j--);
        if(j>=0){
            while(j>=0){
                printf("%c",data[j]);
                j--;
            }
        }else{printf("0");}
        printf("%%");
    }
    return 0;
}

是什么原因导致的呢?

待更新。。。

上一篇 下一篇

猜你喜欢

热点阅读