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

题目简介

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


      这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为0(除非小数部分除了0没有别的数,那么只保留1个0);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为0),本次没有负数。


输入输出格式


输入格式:
一个数s


输出格式:
一个数,即s的反转数


输入输出样例


输入样例#1:
5087462
输出样例#1:
2647805


输入样例#2:
600.084
输出样例#2:
6.48


输入样例#3:
700/27
输出样例#3:
7/72


输入样例#4:
8670%
输出样例#4:
768%

思路

字符串分割,逆序,删除前后导0

C++代码样例

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <string>
#include <cstring>
#include <vector>

using namespace std;

int SplitString(const string &str, vector<string> &v, const string &flag)
{
    size_t pos_0 = 0, pos_1 = 0;
    string temp = "";
    pos_1 = str.find(flag, pos_0);
    while (pos_1 != string::npos)
    {
        v.push_back(str.substr(pos_0, pos_1 - pos_0));
        pos_0 = pos_1 + 1;
        pos_1 = str.find(flag, pos_0);
    }
    v.push_back(str.substr(pos_0, str.length() - pos_0));
    return v.size();
}

unsigned int SearchFlag(char str[])
{
    for (int i = 0; i < strlen(str); i++)
    {
        if (str[i] == '%' || str[i] == '.' || str[i] == '/')
        {
            return str[i];
        }
    }
    return 0;
}

int main(void)
{
    string flagStr = "";
    char flag = '';
    char tempCh = '';
    vector<string> v;
    char str[255] = {''};
    scanf("%s", str);
    if (flag = SearchFlag(str))
    {
        flagStr.push_back(flag);
        SplitString(str, v, flagStr);
    }
    else
    {
        v.push_back(str);
    }
    for (int i = 0; i < 2; i++)
    {
        if (v[i].length() == 0 || i > v.size() - 1)
            continue;
        for (size_t j = 0; j < v[i].length() / 2; j++)
        {
            tempCh = v[i][j];
            v[i][j] = v[i][v[i].length() - j - 1];
            v[i][v[i].length() - j - 1] = tempCh;
        }
        while (v[i][0] == '0' && v[i].length() > 1)
        {
            v[i].erase(0, 1);
        }
        while (v[i][v[i].length() - 1] == '0' && v[i].length() > 1)
        {
            v[i].erase(v[i].length() - 1);
        }
    }
    cout << v[0].c_str() << flag << v[1].c_str();
}
原文地址:https://www.cnblogs.com/csnd/p/12896997.html