题目传送门
题目描述
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。
-
整数反转是将所有数位对调。
-
小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。
-
分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。
-
百分数的分子一定是整数,百分数只改变数字部分。
输入格式
一个实数 s s s
输出格式
一个实数,即 s s s 的反转数
样例 #1
样例输入 #1
5087462
样例输出 #1
2647805
样例 #2
样例输入 #2
600.084
样例输出 #2
6.48
样例 #3
样例输入 #3
700/27
样例输出 #3
7/72
样例 #4
样例输入 #4
8670%
样例输出 #4
768%
提示
【数据范围】
- 对于 25 % 25\% 25% 的数据, s s s 是整数,不大于 20 20 20 位;
- 对于 25 % 25\% 25% 的数据, s s s 是小数,整数部分和小数部分均不大于 10 10 10 位;
- 对于 25 % 25\% 25% 的数据, s s s 是分数,分子和分母均不大于 10 10 10 位;
- 对于 25 % 25\% 25% 的数据, s s s 是百分数,分子不大于 19 19 19 位。
细节也太多了!!!AC代码如下
#include<bits/stdc++.h> //万能头文件
using namespace std;
//定义函数reverse,用于翻转整数。整数特点:最高位数字不为零
string reverse(string s) {
string tmp="";
int i = s.size()-1;
//翻转后数字同样要最高位数字不为零,因此先去掉尾0
while(i>0 && s[i]=='0') i--;
//去掉尾0后从后往前依次存储到tmp中
while(i>=0) tmp += s[i--];
return tmp;
}
int main() {
string s;
cin>>s;
char ch='\0';
if(s.find('.')!=-1 || s.find('/')!=-1 || s.find('%')!=-1) {
int idx;
if(s.find('.')!=-1) {
idx = s.find('.');
ch = '.';
} else if(s.find('/')!=-1) {
idx = s.find('/');
ch = '/';
}else{
idx = s.find('%');
ch = '%';
}
//符号之前为整数,调用函数进行翻转
cout<<reverse(s.substr(0, idx))<<ch;
idx++; //idx标记符号之后翻转起始位置
if(ch=='.') { //小数末尾不为0,翻转之前先去首0
while(idx<s.size()-1 && s[idx]=='0') idx++;
}
cout<<reverse(s.substr(idx, s.size()-idx));
} else cout<<reverse(s.substr(0, s.size())); //整数,调用函数进行翻转
return 0;
}
标签:25,10,反转,样例,整数,find,P1553,升级版
From: https://blog.csdn.net/yuyanjingtao/article/details/144336051