P1553 数字反转(升级版)解法

· · 个人记录

本题没什么特别难的地方,把所有数字都当成字符处理就行了,注意一下字符串结尾操作即可。至于前导0可以用个while循环去掉,但注意不要把单个0也去掉了。主程序识别符号也没什么难的,注意小数位的尾0可以通过再反转2次当成前导0去掉。

#include<iostream>
#include<cstring>
using namespace std;
void rev(char *s){
    char t;
    int len = strlen(s);
    while(len > 1 && s[len-1] == '0') len--;
    s[len] = '\0';
    for(int i=0; i<len/2; i++){
        t = s[i]; s[i] = s[len-1-i]; s[len-1-i] = t;
    }
    return;
}
int main(){
    char s[25], l[25], r[25];
    int sym = 0;
    cin>>s;
    int len = strlen(s);
    for(int i=0; i<len; i++)
        if(s[i] > '9' || s[i] < '0')
            sym = i;
    if(sym == 0){
        rev(s);
        cout<<s<<endl;
    }
    else if(sym == len - 1){
        s[len-1] = '\0';
        rev(s);
        cout<<s<<"%"<<endl;
    }
    else if(s[sym] == '.' || s[sym] == '/'){
        for(int i=0; i<sym; i++)
            l[i] = s[i];
        for(int i=sym+1; i<len; i++)
            r[i-1-sym] = s[i];
        l[sym] = '\0'; r[len-sym-1] = '\0';
        rev(l); rev(r);
        if(s[sym] == '.'){
            rev(r); rev(r);
            cout<<l<<"."<<r<<endl;
        }
        else cout<<l<<"/"<<r<<endl;
    }
    return 0;
}