1 条题解
-
0
【深基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; }
- 1