专栏文章

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

P1553题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miozo2kl
此快照首次捕获于
2025/12/03 03:46
3 个月前
此快照最后确认于
2025/12/03 03:46
3 个月前
查看原文

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

本题思路较为简单,先判断数字种类(整数,小数,分数,百分数)并进行分解,再将分解的数字进行反转即可。

数字反转部分(包括去掉前导0)

CPP
string reverse(string s){//反转函数,其中s是要反转的数字(以字符串进行存储)
    reverse(s.begin(),s.end());//将整个数字反转
    int begin=-1;//begin变量表示从第begin位开始不是0
    for(int i=0;i<s.size();i++){
        if(s[i]!='0'){//如果该位不为0
            begin=i;//将begin改为i
            break;//注意一定要加break,我做题时因为没加break调了整整10分钟
        } 
    }
    if(begin==-1) return "0";//如果begin还是-1则该数字为0,返回0
    else return s.substr(begin);//否则返回从第begin位开始的数字
}

小数时去掉后导0部分

CPP
string back(string s){//去掉后导0函数,s为需要去掉后导0的数字
    int c=0;//记录后导0数量
    for(int i=0;i<s.size();i++){
        if(s[i]=='0') c++;//如果该位为0,则后导0数量加1
        else c=0;//否则之前记录的0的个数不是后导0,将后导0个数改为0
    }
    if(c==s.size()) return "0";//如果后导0数量为该字符串长度,则该数字为0,返回0
    else return s.substr(0,s.size()-c);//否则返回从0到字符串长度减后导0个数的部分
}

AC code

43行,可读性较高
CPP
#include<bits/stdc++.h>
using namespace std;
string s;
string reverse(string s){
    reverse(s.begin(),s.end());
    int begin=-1;
    for(int i=0;i<s.size();i++){
        if(s[i]!='0'){
            begin=i;
            break;
        } 
    }
    if(begin==-1) return "0";
    else return s.substr(begin);
}
string back(string s){
    int c=0;
    for(int i=0;i<s.size();i++){
        if(s[i]=='0') c++;
        else c=0;
    }
    if(c==s.size()) return "0";
    else return s.substr(0,s.size()-c);
}
int main(){
    cin>>s;
   /*string::npos是一个常量,在字符串中查找是如果没查找到则返回它*/
    if(s.find('/')!=string::npos){//判断是否是分数
        string left=s.substr(0,s.find('/'));//分子部分
        string right=s.substr(s.find('/')+1,s.size());//分母部分
        cout<<reverse(left)<<"/"<<reverse(right)<<endl;//将分子和分母分别反转
    }else if(s.find('.')!=string::npos){//判断是否是小数
        string left=s.substr(0,s.find('.'));//整数部分
        string right=s.substr(s.find('.')+1,s.size());//小数部分
        cout<<reverse(left)<<"."<<back(reverse(right))<<endl;//将整数部分和小数部分分别反转
    }else if(s.find('%')!=string::npos){//判断是否是百分数
        string ans=s.substr(0,s.find('%'));//百分数分子部分
        cout<<reverse(ans)<<"%";//将百分数分子反转
    }else{//否则就是整数
        cout<<reverse(s);//将整个数字反转
    }
    return 0;//完结撒花
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...