题目描述

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

这次与 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;
}

遇到问题:

  1. copy(tem.begin(),tem.end(),a.begin()); 复制区间是左闭右开的,即将 tem[begin,end),复制到 a[a.begin(),tem.size());需注意,copy() 的形参为迭代器,不能直接写索引下标。头文件 #include<algorithm>
  2. switch case 语句中尽量不要声明临时变量。
  3. reverse(s.begin(),s.end()); 可是实现字符串的翻转。头文件 #include<algorithm>
  4. string中find()返回值是字母在母串中的位置(下标记录),如果没有找到,那么会返回一个特别的标记 npos(s.find("a"))!=s.npos)。
  5. a.substr(0,pos); 用于提取 a 中[0,pos)范围内的字符。
  6. a.erase(a.begin(),a.end()); 传入两个迭代器 a.begin(),a.end(),清除[a.begin(),a.end())范围内的字符。

P1553 数字反转(升级版)(copy(),reverse(),find(),substr(),erase())的更多相关文章

  1. 洛谷P1553数字反转升级版

    题目链接:https://www.luogu.org/problemnew/show/P1553

  2. 洛谷 P1553 数字反转(升级版)【字符串+STL stack】

    P1553 数字反转(升级版) 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调 ...

  3. 洛谷 P1553 数字反转(升级版)

    P1553 数字反转(升级版) 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调 ...

  4. luogu P1553 数字反转(升级版)

    P1553 数字反转(升级版) 直通 思路: 首先使用char数组进行读入,然后直接按照题目要求进行反转即可, 但要注意的是对零的处理:(有点类似于高精去除前导零) ①去除只是整数.百分数的时候,反转 ...

  5. 字符串--P1553 数字反转(升级版)

    题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调:小数反转是把整数部分的数反转, ...

  6. P1553 数字反转(升级版)

    题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调:小数反转是把整数部分的数反转, ...

  7. 洛谷P1553 数字反转(升级版)

    题目简介 题目描述       给定一个数,请将该数各个位上数字反转得到一个新数.       这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对 ...

  8. (Java实现) 洛谷 P1553 数字反转(升级版)

    题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调:小数反转是把整数部分的数反转, ...

  9. (水题)洛谷 - P1553 - 数字反转(升级版) - 字符串格式转换

    https://www.luogu.org/problemnew/show/P1553 忘记给整数加上前导零去除的代码了.其实不去也可以,额外的进位用一个carry另外存起来就好. #include& ...

随机推荐

  1. 2、TCP/IP

    TCP/IP协议栈:物理层.数据接口层.网络层.传输层.应用层或网络接口层.网络层.传输层.应用层 TCP/IP协议栈的核心协议:1.TCP2.UDP3.ICMP4.IGMP5.ARP:映射IP→Et ...

  2. SDL多线程显示更新窗口

    //初始化SDL2和创建一个窗口,并且将屏幕绘制成大红色 #include <iostream> extern "C" { #include <SDL.h> ...

  3. Spring基础(二)_面向切面(AOP)

    面向切面编程 面向切面编程[AOP,Aspect Oriented Programming]:通过预编译方式和运行期间动态代理实现程序功能的统一维护的技术.AOP 是 Spring 框架中的一个重要内 ...

  4. python 存储数据

    如何进行数据存储,很多程序都要求用户输入某种信息,如让用户存储游戏首选项或提供要可视化的数据. 使用模块json进行数据存储. 1.1.使用json.dump()和json.load() #-*- e ...

  5. Dubbo(四):深入理解Dubbo核心模型Invoker

    一.Dubbo中Invoker介绍 为什么说Invoker是Dubbo核心模型呢? Invoker是Dubbo中的实体域,也就是真实存在的.其他模型都向它靠拢或转换成它,它也就代表一个可执行体,可向它 ...

  6. IPsecVPN:阿里云VPN网关和深信服防火墙打通公有云和公司内网

    简介 目前许多公司网络环境为混合云(私有云,IDC,公司内网融合)的状态,通过内网ip的访问使得工作更加方便,需求也更为迫切,而本文介绍的即是实现私有云和公司内网互通的一种方法,希望对有此需求的小伙伴 ...

  7. java架构之路-(微服务专题)初步认识微服务与nacos初步搭建

    历史演变: 以前我们都是一个war包,包含了很多很多的代码,反正我开始工作的时候做的就是这样的项目,一个金融系统,代码具体多少行记不清楚了,内部功能超多,但是实际能用到的不多,代码冗余超大,每次部署大 ...

  8. Go语言实现:【剑指offer】整数中1出现的次数(从1到n整数中1出现的次数)

    该题目来源于牛客网<剑指offer>专题. 求出1 ~ 13的整数中1出现的次数,并算出100 ~ 1300的整数中1出现的次数?为此他特别数了一下1 ~ 13中包含1的数字有1.10.1 ...

  9. Python3(六) 面向对象

    一.类的定义 1. class Student():     name = ' ' #定义变量     age = 0     def print_file(self):     #定义函数      ...

  10. javascript 完全正确的数据库indexedDB

    //indexedDB var dbName = 'whx', version = '1', dbTableName = 'bbg', request, db, conCls, updateKey, ...