【深基6.习4】数字反转(升级版) · 教师题解

【深基6.习4】数字反转(升级版)

解题思路

按 .、/、% 分离数字段,每段独立反转。整数形式的段去掉多余前导零;小数部分按数值形式同时去掉前导零与末尾零,至少保留一个零。保留原分隔符与段顺序。

正确性说明

逐段反转实现相应定义,清理多余零得到题目要求的标准数字形式,不改变分子分母或整数小数的位置。

易错点

数字可超过 64 位,不转整数;分数不约分;600.084 应为 6.48。

复杂度

时间 O(L),空间 O(L)。

参考代码(C++11)

#include <bits/stdc++.h>
using namespace std;

string rev(string s, bool decimal) {
    reverse(s.begin(), s.end());
    size_t p = s.find_first_not_of('0');
    if (p == string::npos)
        return "0";
    s.erase(0, p);
    if (decimal)
        while (s.size() > 1 && s.back() == '0')
            s.pop_back();
    return s;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    string s;
    cin >> s;
    size_t p = s.find_first_of("./%");
    if (p == string::npos) {
        cout << rev(s, false) << "\n";
    } else if (s[p] == '%') {
        cout << rev(s.substr(0, p), false) << "%\n";
    } else {
        cout << rev(s.substr(0, p), false) << s[p] << rev(s.substr(p + 1), s[p] == '.')
             << "\n";
    }
    return 0;
}
返回题目