TB椰程 TypeBuddy 打字搭子

数字反转(升级版)

洛谷·深入浅出 · 代码 · cpp · 难度 4/5 · 共 1275 字

整数/小数/分数/百分数四类反转

  • 洛谷
  • 练习

正文

// 原题:https://oj.yecheng.tv/p/1424
// 题意:输入可能是整数、小数、分数、百分数,按各自规则反转数位(不交换整数与小数、分子与分母);无负号。
// 思路:按串中是否含 '.' '/' '%' 分类;整数/百分数反转后去前导 0;小数部分反转后去末尾 0(全 0 留一个)。
// 复杂度:O(n)。
// 易错点:四类规则不同;小数反转后末尾的 0 要省掉但至少留一个;百分数只反转数字部分。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string revstrip_lead(string x){
    reverse(x.begin(), x.end());
    while(x.size() > 1 && x[0] == '0') x.erase(0, 1);
    return x;
}
string revstrip_trail(string x){
    reverse(x.begin(), x.end());
    while(x.size() > 1 && x.back() == '0') x.pop_back();
    return x;
}
int main(){
    string s;
    cin >> s;
    if(s.find('.') != string::npos){
        size_t p = s.find('.');
        string a = s.substr(0, p), b = s.substr(p + 1);
        string rb = revstrip_trail(b);
        if(rb.empty()) rb = "0";
        cout << revstrip_lead(a) << "." << rb << endl;
    } else if(s.find('/') != string::npos){
        size_t p = s.find('/');
        string num = s.substr(0, p), den = s.substr(p + 1);
        cout << revstrip_lead(num) << "/" << revstrip_lead(den) << endl;
    } else if(s.back() == '%'){
        string a = s.substr(0, s.size() - 1);
        cout << revstrip_lead(a) << "%" << endl;
    } else {
        cout << revstrip_lead(s) << endl;
    }
    return 0;
}

洛谷·深入浅出的其它内容

打字首页 · 词库画廊 · 编程打字 · 指法入门 · 天梯榜 · 数据分析 · 班级课堂 · 关于我们
椰程 TypeBuddy 打字搭子 —— 键盘指法练习 · 单词记忆 · 班级课堂 · 在线 PK