题目链接

https://www.luogu.org/problemnew/show/P1553


题目描述

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

这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为0(除非小数部分除了0没有别的数,那么只保留1个0);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为0),本次没有负数。


输入输出格式

输入格式:

一个数s

输出格式:

一个数,即s的反转数


思路 

(因为它最多可能很多位数而且有符号所以就用字符串啦)

1、首先我们定义一个字符串,再定义一个flag标记(this sign is very important!)

2、读入字符串(不知道getline的看这里,不会的话用cin也可以)//来自cgp大佬的c++字符串详解

3、从这个首位开始for循环,找到符号的话我们就把flag赋值,下代码中有解析,如果没有符号的话就是纯数字,此时flag的值还是为0,直接反序输出即可

4、如果flag的值发生改变,就对其进行相应的操作

5、操作完输出就可以啦!

(详细的解析见代码)


上代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;const int A = 505;inline int read() {char c = getchar(); int x = 0, f = 1;for( ; !isdigit(c); c = getchar()) if(c == '-') f = -1;for( ; isdigit(c); c = getchar()) x = x * 10 +(c ^ 48);return x * f;
}string s;
int flag = 0;//标记
int d; //d这个变量我本想放在if语句中,但是发现编译不过,就放在了外面int main() {getline(cin, s);int l = s.length();for(int i = 0; i < l; i++) {//赋值给d时d的值为i-1是因为s[i]为符号,应该赋值给符号的前一位//而这个数是百分数时不赋值是因为百分号肯定是最后一位,不用分开处理if(s[i] == '/') { flag = 1; d = i - 1; break; }if(s[i] == '%') { flag = 2; break; }if(s[i] == '.') { flag = 3; d = i - 1; break;}}if(flag == 1) { //是分数的情况 int len = d + 1;//这是为了分成两段处理而定义的len//因为d的值可能会发生改变,所以用len代表d的下一位,也就是这个符号——‘/’while(s[d] == '0') d--;//去除前导零if(d < 0) cout << '0';//如果前半段都是0的话,d的值就会变成-1,这时我们要输出‘0’,自然下面这一步就不会执行了,没有影响for(int i = d; i >= 0; i--) cout << s[i]; //倒着输出来printf("/");//中间的字符while(s[l - 1] == '0') l--;//去除前导零//因为后半段是分母,题目中说分母不会为0,所以不用特判这里啦!for(int i = l - 1; i > len; i--) cout << s[i];//倒着输出来return 0;//程序直接结束}//是分数的话处理不是很难,也不是很简单,因为它的分母不是0,也不用约分,所以并不是很难if(flag == 2)//是百分数的情况 {int len = s.length() - 2;//这里的len为字符串长度减2是因为还有一个符号是百分号while(s[len] == '0') len--;//去除前导零if(len < 0) cout << '0';//如果都是0的话,len的值就会变成-1,输出‘0’,下面这一步就不再执行,没有影响for(int i = len; i >= 0; i--) cout << s[i]; //倒着输出来......cout<<'%';//最后输出百分号return 0;//程序直接结束}//百分数的处理方式很简单,就把它当成数字倒序输出来,再输出一个百分号就可以啦if(flag == 3)//是小数的情况 {int len = d+1;//同flag=1的情况while(s[d] == '0') d--;//删前导零if(d < 0) cout << '0';//同flag=1的情况for(int i = d; i >= 0; i--) cout << s[i];//倒着输出前半段printf(".");//中间的字符while(s[l] == '0') l--;//删前导零len++;//如果不加1就变成判断字符,下面的while语句直接不执行while(s[len] == '0') len++;//删除小数后面的零len--;//len--,为了进行比较if(l - 1 == len) cout << '0';//如果len和l-1的值相等了,说明小数点右边都是零,直接输出0for(int i = l - 1; i > len; i--) cout << s[i];//把它输出来return 0;//结束程序}//自认为是最难的情况,因为整数部分和小数部分都要处理和特判0的情况,而且小数部分最后还不能是零if(flag==0) {int len = s.length() - 1;while(s[len] == '0') len--;for(int i = len; i >= 0; i--) cout << s[i];if(len<0) cout << '0';return 0;}//自认为最简单的一种情况,就不说了
}

洛谷P1553 数字翻转(升级版)相关推荐

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

    洛谷P1553 数字反转(升级版) 题目描述 输入格式 输出格式 输入输出样例 说明/提示 个人理解 整数 百分数 分数 小数 AC代码 写在最后 题目描述 给定一个数,请将该数各个位上数字反转得到一 ...

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

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

  3. 刷题-洛谷-P1179 数字统计

    P1179 数字统计-C语言 1.题目 2.解题过程 结果: 代码: //洛谷 P1179 数字统计 #include <stdio.h> //#define MIN 1 //#defin ...

  4. 洛谷 洛谷 P2708 硬币翻转(高端算法)

    //DAY3.B //题源:洛谷 P2708 硬币翻转 //原题链接:https://www.luogu.com.cn/problem/P2708 #include<stdio.h> #i ...

  5. 洛谷—P1307 数字反转

    题目描述 给定一个整数,请将该数各个位上数字反转得到一个新数.新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2). 输入输出格式 输入格式: 一个 ...

  6. 题解洛谷1179数字统计 记录问题

    文章目录 数字统计 一.思路1 二.思路二 优化 1.想法 2.代码 二.继续优化 不用类型转换 总结 数字统计 题目描述 请统计某个给定范围[L, R][L,R]的所有整数中,数字 22 出现的次数 ...

  7. python高精度乘法_洛谷P1919--A*B Problem升级版(NTT优化高精度乘法)

    题目背景 本题数据已加强,请使用 FFT/NTT,不要再交 Python 代码浪费评测资源. 题目描述 给你两个正整数 a,b,求$ a \times b$. 输入格式 第一行一个正整数,表示 a: ...

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

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

  9. 洛谷1216 数字三角形

    题目描述 观察下面的数字金字塔. 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大.每一步可以走到左下方的点也可以到达右下方的点. 7 3 8 8 1 0 2 7 4 4 4 5 ...

最新文章

  1. 美研究最新生物活性玻璃 可消灭致命的细菌
  2. CAST 和 CONVERT的用法和区别
  3. 怎样将c语言的字体变中文,请问,在c语言中如何将阿拉伯数字转换成汉字,求代码...
  4. wxWidgets:wxAnimationCtrl类用法
  5. RecyclerView用法--展示多种类型Item数据
  6. 双链表的基本操作---插入,删除,交,并,相邻元素的交换,不相邻元素的交换...
  7. php 强制刷新,web端实现后退强制刷新功能代码
  8. jsp自定义标签(taglib)编写的原理和实现
  9. 浅析NVR主流芯片方案
  10. docker 命令2
  11. 网页实现语音对讲_GB28181实现摄像头语音对讲 - web音频采集调用示例
  12. 支持树莓派的路由器系统_真香!国产64位树莓派系统上手评测
  13. Tencent QQ/TIM 文件下载漏洞的研究
  14. 博弈论中的几个经典问题
  15. 虚无世界java路_我的世界攻略大全026-虚无世界3全新版介绍(上)
  16. C盘容量不足,磁盘满了怎么办
  17. python绘制分形图形教程_#python绘制分形图形教程#如何用Python绘制Circos图
  18. MapGuide 6.5、MapGuide Open Source 和MGEnterprise2007区别
  19. win10怎么找回永久删除的文件
  20. 第一章:Django入门篇

热门文章

  1. 同城预约小程序上门服务上门理疗推拿按摩系统养生美容行业程序源码
  2. MarkDown如何打出反引号
  3. 《领导梯队》:4星。企业中六个层级的领导的必知必会和必须不能做的事情。...
  4. 史上最全语义分割综述(FCN,UNet,SegNet,Deeplab,ASPP...)
  5. 解密百度等搜索引擎的工作原理 SEO培训SEO优化课程
  6. 集成企业微信,企业微信扫码登录和企业微信容器内免密登录
  7. Mysql5.7开启远程登陆
  8. 因地制宜,携手共赢 | 亚太地区游戏发行商洞察
  9. android studio 集成TensorFlow Demo
  10. 时间都去哪了-移动Web首屏优化实践