美文网首页ACM题库~
P1553 数字反转(升级版)

P1553 数字反转(升级版)

作者: mokoGoGoGo | 来源:发表于2019-03-31 00:34 被阅读12次

本来这个题目很简单的,就是情况要考虑细致,比如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;
}

是什么原因导致的呢?

待更新。。。

相关文章

  • P1553 数字反转(升级版)

    本来这个题目很简单的,就是情况要考虑细致,比如0,0.0,0/1,0%,100.001,100/100等,这些的反...

  • 数字反转

    针对自然数反转操作;eg: 23 => 32; 1234 => 4321 方式一、 利用数学计算实现 以123...

  • 数字反转

  • 数字反转

    这道题非常像之前做过的一道题:水仙花数,输出对应的位数的数字。这题不一样的在于带有小数点,但是除余没法留小...

  • 9. Palindrome Number.go

    先把数字反转,判断是否和原来相等

  • 024:数字反转

    024:数字反转 总时间限制: 1000ms 内存限制: 65536kB描述给定一个整数,请将该数各个位上数字反转...

  • 反转数字

    给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号...

  • JavaSE常见问题小结

    1.字符串或数字反转问题 对于数字,我们可以将其转化成String类型的字符串进行反转。我们可以使用for循环获取...

  • LeetCode 9. 回文数

    题目描述 题解 简单法 反转一半数字

  • LeeCode 7. Reverse Integer

    就是说,给一个32位的数字,然后溢出的话就返回0,否则返回反转后的数字。 这里注意的就是,反转以后到高位的0要去掉...

网友评论

    本文标题:P1553 数字反转(升级版)

    本文链接:https://www.haomeiwen.com/subject/upwebqtx.html