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& ...
随机推荐
- excel转换成实体
package com.cinc.ecmp.utils; import java.io.IOException; import java.io.InputStream; import java.lan ...
- js 快速取整
我们要将23.8转化成整数 有哪些方法呢 比如 Math.floor( ) 对数进行向下取整 它返回的是小于或等于函数参数,并且与之最接近的整数 Math.floor(5.1) 返回值 //5 M ...
- javascript 闭包的理解(一)
过很多谈如何理解闭包的方法,但大多数文章,都是照抄或者解释<Javascript高级程序设计(第三版)>对于闭包的讲解,甚至例程都不约而同的引用高程三181页‘闭包与变量’一节的那个“返回 ...
- csredis-in-asp.net core理论实战-主从配置、哨兵模式
csredis GitHub https://github.com/2881099/csredis 看了github上的开源项目,上面真的只是单纯的使用文档,可能对于我这种人(菜鸟)就不太友好, 我知 ...
- Centos 7.5安装 Mysql5.7.24
1. 下载 MySQL 本文采用的Linux为是腾讯云 标准型S2 (1 核 1 GB) Centos 7.5 64位 1.1 官网下载地址: https://dev.mysql.com/downl ...
- 解决css布局时两个div一个宽度固定另一个占满剩余宽度的问题
/*左侧div*/ .left-div{width: 220px;height: 100%;position: fixed;background: #FFFFFF;} /*右侧div*/ .right ...
- spring boot(一)创建项目
网上有很多springboot的入门教程,自己也因为项目要使用springboot,所以利用业余时间自学了下springboot和springcloud,使用下来发现springboot还是挺简单的, ...
- JavaScript 构造树形结构的一种高效算法
引言 我们经常会碰到树形数据结构,比如组织层级.省市县或者动植物分类等等数据.下面是一个树形结构的例子: 在实际应用中,比较常见的做法是将这些信息存储为下面的结构,特别是当存在1对多的父/子节点关系时 ...
- 深度探索c++对象模型阅读笔记图
- 【题解】SDOI2010所驼门王的宝藏(强连通分量+优化建图)
[题解]SDOI2010所驼门王的宝藏(强连通分量+优化建图) 最开始我想写线段树优化建图的说,数据结构学傻了233 虽然矩阵很大,但是没什么用,真正有用的是那些关键点 考虑关键点的类型: 横走型 竖 ...