题目描述

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

这次与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%

说明/提示

所有数据:25%s是整数,不大于20位

25%s是小数,整数部分和小数部分均不大于10位

25%s是分数,分子和分母均不大于10位

25%s是百分数,分子不大于19位

(20个数据)

首先,我们看到这个题,易分析出这个题有四个步骤:拆分,翻转,去零,输出。

所以我们只要分开编出几个函数进行这几个操作即可。

经过观察,易发现:小数的小数部分需要去除的是后部的零,而其他的需要去除的是前部的零。

不多说了,直接上程序:(用的是对字符串的处理)(程序有点长,但思路非常简单易懂)

 #include<bits/stdc++.h>
#include <cstring>
using namespace std;
string qutou(string a)//作用:去除头部的零
{
int len;
while(a[]==''&&len!=)//如果第一位还是零
{
len=a.size();
a=a.substr(,len-);//把除了第一位之外的部分向前移动一位,覆盖第一位的零
}
return a;
}
string quwei(string a)//作用:去除头部的零
{
int len=a.size();
while(a[len-]=='')//如果第一位还是零
{
a=a.substr(,len- );//把除了最后一位之外的部分向后移动一位,覆盖最后一位的零
len--;
}
return a;
}
string fanzhuan(string a)//作用:将数翻转
{
int len=a.size();
string b;//创建一个临时字符串"b"
for(int i=len-;i>=;i--)//将a反向粘贴到b上
{
b+=a[i];
}
return b;//返回b
}
int main()
{
string front,behind,total;//字符串front,behind分别用来储存小数和分数的前半部分和后半部分
getline(cin,total);
int len=total.size(),n=,form=;
for(int i=;;i++)//遍历字符串
{
if(total[i]!='/'&&total[i]!='%'&&total[i]!='.')//如果当前位置不是特殊字符
{
front+=total[i];//将这个字符储存进front中
}
if(total[i]=='/')//如果是'/',说明分子已经读入结束
{
form=;//记录下这个数是分数
n=i+;
break;//结束读取分子
}
if(total[i]=='%')//如果是'%',说明百分数已经读入结束
{
form=;//记录下这个数是百分数
break;//结束读取
}
if(total[i]=='.')//如果是'.',说明整数部分已经读入结束
{
form=;//记录下这个数是小数
n=i+;
break;//结束读取整数部分
}
if(i==len-)//如果一直读取到了最后一位还没有特殊符号
{
form=;//记录下这个数是整数
break;//结束读取
}
}
if(form==||form==)//如果是分数或小数
{
for(int j=n;j<=len-;j++)//读取分母(或小数部分)
{
behind+=total[j];
}
behind=fanzhuan(behind);//翻转后部
}
front=fanzhuan(front);//翻转前部
front=qutou(front);//对前部进行去除头部的零
if(form==)//如果是分数
{
behind=qutou(behind);//对后部进行去除头部的零
if(front=="\0")//如果前部去头之后什么也不剩,说明前部是零
{
cout<<"0/"<<behind;
}
else
{
cout<<front<<"/"<<behind;//输出
}
}
if(form==)//如果是百分数
{
front=qutou(front);
if(front=="\0")//如果前部去头之后什么也不剩,说明前部是零
{
cout<<"0%";
}
else
{
cout<<front<<"%";//输出
}
}
if(form==)//如果是分数
{
behind=quwei(behind);//对后部进行去除尾部的零
if(behind=="\0")
{
if(front=="\0")//如果前部去头之后什么也不剩,说明前部是零
{
front="";
}
cout<<front<<".0";
}
else
{
cout<<front<<"."<<behind;//输出
}
}
if(form==)//如果是整数
{
front=qutou(front);
if(front=="\0")//如果前部去头之后什么也不剩,说明前部是零
{
cout<<"";
}
else
{
cout<<front;//输出
}
}
return ;
}

最新文章

  1. View动画和属性动画
  2. mysql 时间戳 按周、日、月 统计方法 附 date格式
  3. 测试C++代码与WebBrowser HTML的互动
  4. IOS线程的一些总结
  5. MVP+RXJAVA+RecyclerView实现sd卡根目录下的所有文件中的照片加载并显示
  6. UML的概念模型
  7. PowerDesigner自定义列和过滤器
  8. LA - 4043 - Ants
  9. &lt;蛇形填数&gt;--算法竞赛 入门经典(第2版)- 3.1 数组 程序3-3 蛇形填数
  10. H5微场景宽、高度自适应办法
  11. NodeJS安装第一个工程
  12. 201521123039 《java程序设计》第十周学习总结
  13. amaze UI 笔记 - CSS
  14. hibernate框架学习笔记4:主键生成策略、对象状态
  15. 背水一战 Windows 10 (115) - 后台任务: 通过 toast 激活后台任务, 定时激活后台任务
  16. 如何突破Ue4材质编辑器没有Pass的概念
  17. 机器学习--Logistic回归
  18. Spring Boot 揭秘与实战(二) 数据缓存篇 - Guava Cache
  19. Python调用sqlAlchemy
  20. js-判断当前日期的天数

热门文章

  1. dynamic web module version
  2. 2018-8-10-C#-6.0-字符串-String-Interpolation
  3. E420笔记本升级固态硬盘
  4. 开发API整理(转)
  5. 常用linux 命令
  6. 学习linux命令,看这篇2w多字的linux命令详解
  7. 调用第三方库时需注意MD/MT的链接编译方式(遇到的坑记录)
  8. $Poj2054\ Color\ a\ Tree\ $ 贪心
  9. 详解js的bind、call、apply
  10. 记一次 爬取LOL全皮肤原画保存到本地的实例