P1553 数字反转(升级版)(copy(),reverse(),find(),substr(),erase())
题目描述
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与 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个数据)
思路:
这道题就是一道细节题,很坑,稍微不小心就会出错。
分为两个大部分
1、整数情况:去除反转后的前导零后反向输出
2、非整数情况(百分数、分数、小数):
a.百分数:先忽略掉百分号,去除数字部分反转后的前导零后,反向输出数字部分,再输出百分号
b.分数:分子部分,去除反转后的前导零,再反向输出分子部分;输出分数线;分母部分,去除反转后的前导零,再反向输出分母部分。
c.小数:整数部分,去除反转后的前导零,再反向输出整数部分;输出小数点;小数部分,去除反向后的后导零,再反向输出小数部分。
不用考虑 0098 类型的整数以及 0.8900类型的小数。
代码:
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
string delzero(string a){
int k=;
string tem; //确定首个不是 0 的数字的索引
while(k<a.size()&&a[k]==''){
k++;
}
if(k==a.size()){//整数且全为 0
return "";
}
if(a[k]=='.'||a[k]=='/'||a[k]=='%'){//不是整数,但整数部分全为 0
tem+="";
}
for(k;k<a.size();k++){//拼接上剩余部分
tem+=a[k];
}
return tem;
} int main(){
string a;
cin>>a;
string tem="";
int choise=,pos=-;
if(a.find(".")!=a.npos){
choise=;
pos=a.find(".");
}
else if(a.find("/")!=a.npos){
choise=;
pos=a.find("/");
}
else if(a.find("%")!=a.npos){
choise=;
}
int k=;
switch (choise){
case ://整数
reverse(a.begin(),a.end());
a=delzero(a);
break;
case ://小数
case ://分数
//处理后半部分
tem=a.substr(pos+);
tem=delzero(tem);
reverse(tem.begin(),tem.end());
tem=delzero(tem);
copy(tem.begin(),tem.end(),a.begin()+pos+);
a.erase(a.begin()+pos+tem.size()+,a.end());
//处理前半部分
reverse(a.begin(),a.begin()+pos);
a=delzero(a);
break;
case ://百分数
reverse(a.begin(),a.end()-);
a=delzero(a);
break;
}
cout<<a;
}
遇到问题:
copy(tem.begin(),tem.end(),a.begin()); 复制区间是左闭右开的,即将 tem[begin,end),复制到 a[a.begin(),tem.size());需注意,copy() 的形参为迭代器,不能直接写索引下标。头文件 #include<algorithm>
switch case 语句中尽量不要声明临时变量。
reverse(s.begin(),s.end()); 可是实现字符串的翻转。头文件 #include<algorithm>
string中find()返回值是字母在母串中的位置(下标记录),如果没有找到,那么会返回一个特别的标记 npos(s.find("a"))!=s.npos)。a.substr(0,pos); 用于提取 a 中[0,pos)范围内的字符。
a.erase(a.begin(),a.end()); 传入两个迭代器 a.begin(),a.end(),清除[a.begin(),a.end())范围内的字符。
P1553 数字反转(升级版)(copy(),reverse(),find(),substr(),erase())的更多相关文章
- 洛谷P1553数字反转升级版
题目链接:https://www.luogu.org/problemnew/show/P1553
- 洛谷 P1553 数字反转(升级版)【字符串+STL stack】
P1553 数字反转(升级版) 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调 ...
- 洛谷 P1553 数字反转(升级版)
P1553 数字反转(升级版) 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调 ...
- luogu P1553 数字反转(升级版)
P1553 数字反转(升级版) 直通 思路: 首先使用char数组进行读入,然后直接按照题目要求进行反转即可, 但要注意的是对零的处理:(有点类似于高精去除前导零) ①去除只是整数.百分数的时候,反转 ...
- 字符串--P1553 数字反转(升级版)
题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调:小数反转是把整数部分的数反转, ...
- P1553 数字反转(升级版)
题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调:小数反转是把整数部分的数反转, ...
- 洛谷P1553 数字反转(升级版)
题目简介 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对 ...
- (Java实现) 洛谷 P1553 数字反转(升级版)
题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调:小数反转是把整数部分的数反转, ...
- (水题)洛谷 - P1553 - 数字反转(升级版) - 字符串格式转换
https://www.luogu.org/problemnew/show/P1553 忘记给整数加上前导零去除的代码了.其实不去也可以,额外的进位用一个carry另外存起来就好. #include& ...
随机推荐
- Dubbox 环境搭建-新(Windows下)
分布式服务框架 dubbo/dubbox 入门示例 dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务框架. 官网首页:http://dubbo.io/ ,官方用户指南 http:// ...
- 2018icpc徐州网络赛-H Ryuji doesn't want to study(线段树)
题意: 有n个数的一个数组a,有两个操作: 1 l r:查询区间[l,r]内$a[l]*(r-l+1)+a[l+1]*(r-l)+a[l+2]*(r-l-1)+\cdots+a[r-1]*2+a[r] ...
- python机器学习——正则化
我们在训练的时候经常会遇到这两种情况: 1.模型在训练集上误差很大. 2.模型在训练集上误差很小,表现不错,但是在测试集上的误差很大 我们先来分析一下这两个问题: 对于第一个问题,明显就是没有训练好, ...
- Go语言实现:【剑指offer】正则表达式匹配
该题目来源于牛客网<剑指offer>专题. 请实现一个函数用来匹配包括 . 和 * 的正则表达式.模式中的字符.表示任意一个字符,而 * 表示它前面的字符可以出现任意次(包含0次). 在本 ...
- step1:准备歌词之《前端开发是个啥》
以下是给大家介绍前端开发的填词,曲子是李圣杰的<最近>,大家喜欢可以试试唱. 点赞关注超过100的平台,我后续上来发本人原唱视频(目前正在练习中...),另外大家觉得哪些词写得不好的,欢迎 ...
- golang 运算符
/* 算术运算符 : + - * / % ++ -- 关系运算符 : == != > < >= <= 逻辑运算符 : && || ! 赋值运算符 : = += ...
- 最近很火的namebase羊毛, 手把手教你怎么薅
闲话少说直接说步骤: 1. 羊毛 https://www.namebase.io/airdrop 要求条件: 1) 要有github账号 2) 2019年2月之前有16+个follower 3) 要有 ...
- WLAN802.11
IEEE 802.11,1997年,原始标准(2Mbit/s,播在2.4GHz).DSSS, FHSS.该协议的一大缺点是它提供了太多的选择使得互操作性很难实现.所以它不严密,更像是一个beta标准, ...
- jmeter接口测试(登录、注册)
Jmeter 进行接口测试流程: Jmeter 的下载地址:http://jmeter.apache.org/download_jmeter.cgi 下面举例说明使用流程,有两种参数传递的方式,我们以 ...
- linux系统初装
一.linux系统安装 VMware workstation是一个虚拟机软件,它的主要作用是在原有操作系统(windows或linux)下,虚拟出一台电脑,你可以在这台虚拟电脑上安装不同的操作系统,进 ...