赞
踩
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。
- - 整数反转是将所有数位对调。
- - 小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数与小数部分。
- - 分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。
- - 百分数的分子一定是整数,百分数只改变数字部分。
- 输入格式
- 一个实数 s
- 输出格式
- 一个实数,即 s 的反转数
样例输入 样例输出 5087462 2647805 600.084 6.48 700/27 7/72 8670% 768%
- #include<iostream>
- #include<string>
- using namespace std;
- int main()
- {
- string s;
- char p = 0;//放符号
- int cnt = 0;
- cin >> s;
- for (int i = 0; i < s.size(); i++)
- {
- if (s[i] >= '0' && s[i] <= '9') cnt++;//记录第一个数长度
- else //遇到符号,记录,跳出
- {
- p = s[i];
- break;
- }
- }
- int x = cnt;//记下第一个数末后一个的位置,也就是符号的位置,如果是分数或小数就要用
- cnt--;
- while (s[cnt] == '0' && cnt > 0) cnt--;//去除多余前导0;
- for (int i = cnt; i >= 0; i--)//输出第一个数
- cout << s[i];
- if (p == 0) return 0;//无符号return 0
- else
- if (p == '%') { cout << p; return 0; }
- else cout << p;//其他继续
- int m = s.size() - 1;
- while (s[x + 1] == '0' && x < m - 1) x++;//去除末尾0
- while (s[m] == '0' && m > x + 1) m--; //去除多余前导0
- for (int i = m; i > x; i--)//输出第二个数
- cout << s[i];
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。