洛谷数字反转升级版

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

#include <iostream>                               
#include <string>                                    //考察对string操作函数及STL反转函数的使用!
#include<algorithm>
using namespace std;
string my_reverse01(string s)
{
int box = 0;
reverse(s.begin(),s.end());
for (auto n : s)
{
if (n == '0')
box++;
else
break;
}
s.erase(s.begin(), s.begin() + box);
return (s != "" ? s : "0");                         //要注意特例输入情况为0时!
}
string my_reverse02(string s)
{
int box = 0;
reverse(s.begin(), s.end());
for (int i = s.size() - 1; i >= 0; i--)
{
if (s[i] == '0')
box++;
else
break;
}
s.erase(s.end() - box, s.end());
return (s != "" ? s : "0");
}
int main()
{
string s;
cin >> s ;
if (s.find('/')<1000)
{
cout << my_reverse01(s.substr(0, s.find('/'))) << '/' << my_reverse01(s.substr(s.find('/') + 1)) << endl;


}
else if (s.find('.')<1000)
{
cout << my_reverse01(s.substr(0, s.find('.'))) << '.' << my_reverse02(s.substr(s.find('.') + 1)) << endl;
}
else if (s.find('%')<1000)
{
cout << my_reverse01(s.substr(0, s.size() - 2)) << '%' << endl;
}
else
cout << my_reverse01(s.substr(0)) << endl;
system("pause");
return 0;
}

猜你喜欢

转载自blog.csdn.net/slience_646898/article/details/79393330
今日推荐