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& ...
随机推荐
- dotnet core 集成到 Mattermost 聊天工具
在找了很久的团队交流工具,发现了 Mattermost 最好用,但是还需要做一些定制化的功能,于是就找到了 Mattermost 插件开发,还找到了如何自己写服务集成到 Mattermost 里面 本 ...
- GapMinder气泡图:在线互动图表数据平台
GapMinder:在线互动图表数据平台是一个将国际统计数据转换成活动的.交互的和有趣的图表,以在线统计数据为基础的互动图表集的完美世界.目的是通过增进对可以自由访问的公共统计数据的使用和理解,以促进 ...
- oracle解除被锁定的表的状态
select b.owner,b.object_name,a.session_id,a.locked_mode,c.serial#,c.sid||','||c.serial# from v$loc ...
- Android 隐藏顶部菜单栏
Android 隐藏状态栏 在Activity中: getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 在fragmen ...
- 关于本地用svn up的时候报cannot update svn folder: "unversioned directory of the same name already exists
这是因为本地有手动添加过一个文件夹,然后和svn上的同名文件夹重名了,所以无法从svn update下来 解决办法如下: 1.先给本地的重名文件夹改名 mv dirname repeatdirnam ...
- HDU4528 小明捉迷藏 [搜索-BFS]
一.题意 小明S在迷宫n*m中找大明D和二明E,障碍物X不能走,问你计算是否能在时间t内找到大明和二明 二.分析 2.1与普通的BFS不同,这里可以走回头路,这里应该建立四维的标记数组标记数组,例如v ...
- Linux下搭建实现HttpRunnerManager的异步执行、定时任务及任务监控
前言 在之前搭建的HttpRunnerManager接口测试平台,我们还有一些功能没有实现,比如异步执行.定时任务.任务监控等,要完成异步执行,需要搭建 RabbitMQ 等环境,今天我们就来实现这些 ...
- Gif动图压缩java版
简单说明下,如果不是压缩动图的话只用java本身的包足够实现压缩和截取图片了,为了能够压缩gif动图,这里引用了两个文件 AnimatedGifEncoder 和 GifDecoder, 先用Deco ...
- HDU5179 beautiful number 题解 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5179 题目大意: 给你一个数 \(A = a_1a_2 \cdots a_n\) ,我们称 \(A\) ...
- apache相关实验-2
一.Apache+openssl 实现 https HTTPS(全称:Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的 HTTP 通道,简单 ...