洛谷 P1553 数字反转(升级版)

发布时间 2023-08-05 15:33:25作者: sleepwind

题目描述

给定一个数,请将该数各个位上数字反转得到一个新数。

  • 整数反转是将所有数位对调。
  • 小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。
  • 分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。
  • 百分数的分子一定是整数,百分数只改变数字部分。
  • 数据没有负数。

分析

这道题具体实现并不难,但是有点坑。
首先写出大体框架:

string a;
void t1(),t2(),t3(),t4();
int main() {
    cin >> a;
    if (a[a.length()-1]=='%') t3();//百分数
    for (auto k : a) {
        if (k == '.') t1();//小数
        else if (k == '/') t2();//分数
    }
    t4();//整数
    return 0;
}

接下来依次实现各部分。

  1. 整数比较简单。首先将字符串转化为整数,利用模运算倒序得到每一位数字即可。
    但这里要注意数据范围:
  • 对于 \(25\%\) 的数据,\(s\) 是整数,不大于 \(20\)

    所以 记得开\(\textup{unsigned}\) \(\textup{long}\) \(\textup{long}\)

  1. 百分数实质上就是整数后多输出了一个百分号,同上。

  2. 小数可以利用sscanf()从字符串中分别读出整数部分和小数部分,分别处理即可。

  3. 分数只不过是把小数的小数点换成了分数线,同上。

代码

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;
string a;
void t1(),t2(),t3(),t4();
int main() {
    cin >> a;
    if (a[a.length()-1]=='%') t3();//百分数
    for (auto k : a) {
        if (k == '.') t1();//小数
        else if (k == '/') t2();//分数
    }
    t4();//整数
    return 0;
}

void t1() {
    unsigned long long t=0, c=0, k=0, g=0;
    sscanf(a.c_str(), "%llu.%llu", &t, &c);
    while (t) {
        k = k*10+t%10;
        t/=10;
    }
    while (c) {
        g = g*10+c%10;
        c/=10;
    }
    cout << k<< '.' << g;
    exit(0);
}

void t2() {
    unsigned long long t=0, c=0, k=0, g=0;
    sscanf(a.c_str(), "%llu/%llu", &t, &c);
    while (t) {
        k = k*10+t%10;
        t/=10;
    }
    while (c) {
        g = g*10+c%10;
        c/=10;
    }
    cout << k<< '/' << g;
    exit(0);
}

void t3() {
    unsigned long long t=0, c=0;
    for (unsigned long long i=0; i<a.length()-1; i++) {
        t = t*10+(a[i]-'0');
    };
    while (t) {
        c = c*10+t%10;
        t/=10;
    }
    cout << c << '%';
    exit(0);
}

void t4() {
    unsigned long long t=0, c=0;
    for (unsigned long long i=0; i<a.length(); i++) {
        t = t*10+(a[i]-'0');
    }
    while (t) {
        c = c*10+t%10;
        t/=10;
    }
    cout << c;
    exit(0);
}