题解:P1553 数字反转(升级版)

· · 题解

题解:P1553 数字反转(升级版)

思路

根据题面,可以看出一共有四种情况,分别是:

注:要特判 00.nn.00/n0 的情况。(真的卡了我很久)。

AC Code

#include<bits/stdc++.h>
using namespace std;
char w='Q'; //一开始是整数
string a; 
int y;

int main(){
    cin>>a;

    for(int i=0;i<a.size();i++){
        if(a[i]=='.'){ //是小数
            w='X';
        }
        if(a[i]=='/'){ //是分数
            w='C';
        }
        if(a[i]=='%'){ //是百分数
            w='V';
        }
    }
    if(w=='Q'){
        if(a=="0"){ //特判0
            cout<<0;
            return 0;
        }
        int len=a.size()-1;
        while(a[len]=='0') len--; //前导零
        for(int i=len;i>=0;i--){
            cout<<a[i];
        }   
    }

    if(w=='X'){
        int j=0;
        while(a[j]!='.'){
            y++;
            j++;
        }
        int len=y-1;
        while(a[len]=='0') len--; //前导零
        if(len==-1) cout<<0; //特判整数部分是否为零
        for(int i=len;i>=0;i--){
            cout<<a[i];
        }
        cout<<".";
        len=y+1;
        while(a[len]=='0') len++; //后面的零
        if(len==a.size()) cout<<0; //特判小数部分是否为零
        for(int i=a.size()-1;i>=len;i--){
            cout<<a[i];
            }
    }
    if(w=='C'){
        int j=0;
        while(a[j]!='/'){
            y++;
            j++; 
        }
        int len=y-1;
        while(a[len]=='0') len--; //前导零
        if(len==-1) cout<<0; //特判分子数部分是否为零
        for(int i=len;i>=0;i--){
            cout<<a[i];
        }
        cout<<"/";
        len=a.size()-1;
        while(a[len]=='0') len--; //前导零
        for(int i=len;i>=y+1;i--){
            cout<<a[i];
        }
    }
    if(w=='V'){
        if(a=="0%"){ //特判
            cout<<0<<'%';
            return 0;
        }
        int len=a.size()-2;
        while(a[len]=='0') len--; //前导零
        for(int i=len;i>=0;i--){
            cout<<a[i];
            }
        cout<<"%";
    }
    return 0;
}