【深基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;
}