P1553 数字反转(升级版)
题目描述
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为0(除非小数部分除了0没有别的数,那么只保留1个0);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为0),本次没有负数。
输入格式
一个数s
输出格式
一个数,即s的反转数
输入输出样例
5087462
2647805
600.084
6.48
700/27
7/72
8670%
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 ;
}
P1553 数字反转(升级版)的更多相关文章
- 洛谷P1553数字反转升级版
题目链接:https://www.luogu.org/problemnew/show/P1553
- 洛谷 P1553 数字反转(升级版)【字符串+STL stack】
P1553 数字反转(升级版) 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调 ...
- 洛谷 P1553 数字反转(升级版)
P1553 数字反转(升级版) 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调 ...
- luogu P1553 数字反转(升级版)
P1553 数字反转(升级版) 直通 思路: 首先使用char数组进行读入,然后直接按照题目要求进行反转即可, 但要注意的是对零的处理:(有点类似于高精去除前导零) ①去除只是整数.百分数的时候,反转 ...
- 字符串--P1553 数字反转(升级版)
题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调:小数反转是把整数部分的数反转, ...
- P1553 数字反转(升级版)(copy(),reverse(),find(),substr(),erase())
题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调:小数反转是把整数部分的数反 ...
- (Java实现) 洛谷 P1553 数字反转(升级版)
题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调:小数反转是把整数部分的数反转, ...
- 洛谷P1553 数字反转(升级版)
题目简介 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对 ...
- (水题)洛谷 - P1553 - 数字反转(升级版) - 字符串格式转换
https://www.luogu.org/problemnew/show/P1553 忘记给整数加上前导零去除的代码了.其实不去也可以,额外的进位用一个carry另外存起来就好. #include& ...
随机推荐
- 开包即食的教程带你浅尝最新开源的C# Web引擎 Blazor
在今年年初, 恰逢新春佳节临近的时候. 微软给全球的C#开发者们, 着实的送上了一分惊喜. 微软正式开源Blazor ,将.NET带回到浏览器. 这个小惊喜, 迅速的在dotnet开发者中间传开了. ...
- NoSQL入门)(详细)
NoSQL入门 (原创:黑小子-余) 1.NoSQL是什么 NoSql(NoSQL=Not Only SQL),意即“不仅仅是SQL”,泛指菲关系型数据库.传统的关系数据库在应付web2.0网站,特别 ...
- DEVOPS技术实践_22:根据参数传入条件控制执行不同stage
前面学习了参数的传递和调用,下面研究一下根据参数作为条件执行不同的stage 使用叫when 和expression控制某一个stage的运行, 运行场景例如写了多个stage,这个pipeline脚 ...
- 洛谷$P$2252 取石子游戏 博弈论
正解:博弈论 解题报告: 传送门! 威佐夫博弈板子昂$QwQ$ 关于这一类问题也有个结论,是说,先手必败的状态一定形如$(\left \lfloor i+\phi \right \rfloor,\le ...
- SQL预处理
每向数据库发送一条SQL语句,数据库中的SQL解释器就会将SQL语句转换成数据库底层命令,然后执行该命令完成相关的数据库操作.如果频繁的向数据库提交SQL语句,势必会增加数据库中SQL解释器的负担,进 ...
- Windows 7 + Tiny Linux 4.19 + XFS + Vmware Workstation 15 (PRO) 下篇dockerの奥义
美好的事物总是来自不易,而我是一个docker新手 从以上开场,请各位follow me站在一个初学者的角度,一步一步用最简单的视角审视docker和它的真实存在 上篇预告:Windows 7 + T ...
- html 小游戏合集(1.0)
最近做了个小游戏合集,有点沙雕,毕竟是1.0,将就看看. <!DOCTYPE html> <html> <head> <meta charset=" ...
- OpenLayers4 隐藏(hide)Feature
需求: 需要将同一图层的要素进行分类显示和隐藏(类似于图层控制) 方法: 使用setStyle方法将Feature的样式设置为null. 环境: win10.google chrome.OL 4.3 ...
- QGIS WGS84转其它坐标系并计算坐标
需求: 将带有经度.纬度(WGS84坐标系)坐标的文本(*.txt)转换成指定投影坐标系的shp文件并计算x,y坐标. 环境和工具: WIN10.QGIS2.16.带有经纬度坐标的文本.格式如下图: ...
- 【移动测试】你的测试用例中,是否包含App前后台切换
App前后台切换是我们平时常用的一个操作,比如:按手机的home键将应用置于后台.直接按手机电源键关闭屏幕或者通过最近打开的应用列表切换应用等,由此,我们可以得出结论:当app置于前台时,它的页面对我 ...