数字反转(洛谷P1553):利用STL的优雅实现

利用C++的STL优雅的完成此题

查看题目

解题思路

这是一道新手入门的题目但是有很多细节

做法我们分情况讨论下

  1. 对于整数去除前后的0并直接反转

  2. 对于百分数删去百分号后按照整数的套路即可

  3. 对于分数找到/并以他为界分割成两个字符串分别去除前后的0并反转然后再合并

  4. 对于小数同上不过要将分隔符换成.

然后输出即可

这样看起来整个题目也并没有那么复杂了

程序实现

根据上面的归纳可以看出整个程序无非就几个步骤

  • 去除前后的0

  • 判断字符串是属于分数还是小数又或者是百分数

  • 将字符串倒置

  • 分割字符串

为了简单与优雅我们可以直接调用STL的函数解决

字符串类型的判断

判断字符串的类型我们可以直接在字符串中查找符号来判断如果既没有/也没有.也没有%那肯定就是整数了

String类中间内置了一个String.find(待查找的字符串)的函数若找到了则返回字符的位置否则返回string::npos我们直接拿来用就好

字符串的倒置

同样的STL中内置了一个很好用的反转函数reverse(起始迭代器,结束迭代器)我们同样可以直接拿来用

迭代器怎么获取直接待反转String.begin()待反转String.end()即可

分割字符串

在其他的语言中字符串类型一般都内置了split这样的函数C++好像是一个特例

那就自己实现吧

在字符串类中还有一个好用的函数待分割String.substr(起始位置,取出的长度)可以直接取出给定起点和长度的子字符串

首先利用find函数找到符号的位置记录在变量pos

然后提取前半部分起始位置当然是0长度为pos这样取到的就是 0~pos-1 的子字符串

接着提取后半部分起始位置是pos+1长度为总长度-pos这样取到的就是 pos+1~总长度 的子字符串

0

这个就实在没有库函数可以利用了STL也不可能提供这样奇怪的库函数

当然自己写一个也很简单

弄个循环如果第一位是0那就删掉第一位然后重新判断

同理从后往前找即可一直删到最后一位不为0即可

注意这里有个小坑如果0000这样的那么就会返回空字符串但显然至少需要保留一个0那我们判断一下就好

AC代码

#include <bits/stdc++.h>//万能头文件
using namespace std;
string zero(string o)//辅助函数用于去除字符串前置的0与后置的0
{
    while (o[o.length()-1]=='0')//去后0
        o=o.substr(0,o.length()-1);
    while (o[0]=='0')//去前0
        o=o.substr(1,o.length()-1);
    return o==""?"0":o;//一个fix避免全是0就给了个空字符串
}
int main()
{
    string o;
    cin >> o;
    if (o.find(".")!=string::npos)//小数
    {
        string a=o.substr(0,o.find(".")),b=o.substr(o.find(".")+1,o.length()-o.find("."));
        a=zero(a);
        b=zero(b);
        reverse(a.begin(),a.end());
        reverse(b.begin(),b.end());
        cout << a << "." << b;
    }
    else if (o.find("\%")!=string::npos)//百分数
    {
        string a=o.substr(0,o.find("\%"));
        a=zero(a);
        reverse(a.begin(),a.end());
        cout << a << "\%";
    }
    else if (o.find("/")!=string::npos)//分数
    {
        string a=o.substr(0,o.find("/")),b=o.substr(o.find("/")+1,o.length()-o.find("/"));
        a=zero(a);
        b=zero(b);
        reverse(a.begin(),a.end());
        reverse(b.begin(),b.end());
        cout << a << "/" << b;
    }
    else//啥都找不到自然是整数
    {
        o=zero(o);
        reverse(o.begin(),o.end());
        cout << o;
    }
    return 0;
}