洛谷P1553 数字翻转(升级版)

题目链接

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

洛谷P1553 数字翻转(升级版)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. 洛谷P1118 数字三角形游戏

    洛谷1118 数字三角形游戏 题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直 ...

  8. 洛谷 P5660 数字游戏 & [NOIP2019普及组]

    传送门 洛谷改域名了QAQ 解题思路 没什么好说的,一道红题,本不想发这篇博客 ,但还是尊重一下CCF吧QAQ,怎么说也是第一年CSP呢! 用getchar一个个读入.判断.累加,最后输出即可. 不过 ...

  9. 洛谷——P1618 三连击(升级版)

    P1618 三连击(升级版) 题目描述 将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”. //感谢 ...

随机推荐

  1. hexo博客更新主题后上传Git操作

    克隆主题: git clone https://github.com/SuperKieran/TKL.git _config.yml文件中主题改为新增主题 # Extensions ## Plugin ...

  2. 从零开始学习html(七)CSS样式基本知识

    一.内联式css样式,直接写在现有的HTML标签中 <!DOCTYPE HTML> <html> <head> <meta http-equiv=" ...

  3. openvswitch技术总结

    OVS技术总结 一.OVS的组成 二.OVS的匹配条件和动作 三.OVS的发展方向 四.OVS的操作实践 OVS与Namespace配合模拟租户之间的数据通信 基本思路: Namespace模拟出不同 ...

  4. loadrunner 运行场景-常见Graph简介

    运行场景-常见Graph简介 by:授客 QQ:1033553122 A.   Web Resource Graphs 1.   概述 a)   Hits per Second Graph Hits ...

  5. Java数据解析---SAX

    一.Sax解析 是从头到尾逐行逐个元素读取内容,修改较为不便,但适用于只读的大文档. Sax采用事件驱动的方式解析文档.简单点说,如同在电影院看电影一样,从头到尾看一遍就完了,不能回退(Dom可来来回 ...

  6. 2018最新大厂Android面试真题

    前言 又到了金三银四的面试季,自己也不得不参与到这场战役中来,其实是从去年底就开始看,android的好机会确实不太多,但也还好,3年+的android开发经历还是有一些面试机会的,不过确实不像几年前 ...

  7. android.support不统一的问题

    今天supprt28遇到的问题,由于28还是预览版,还存在一些bug 都是因为如果程序内出现不同的,support或者其他外部引用库的多个版本,Gradle在进行合并的时候会使用本地持有的,最高版本的 ...

  8. Dell XPS 13 9306安装 macOS 10.12.6

    一直在考虑买一个手上的本,轻薄,办公方便.个人很喜欢mac 下的那些软件,尤其是keynote.就锁定在Macbook Pro上,但是又觉得没有什么玩头,后来一直找,觉得xps也很符合要求,就开始调查 ...

  9. 简单易懂的程序语言入门小册子(1):基于文本替换的解释器,lambda演算

    最近比较闲,打算整理一下之前学习的关于程序语言的知识.主要的内容其实就是一边设计程序语言一边写解释器实现它.这些知识基本上来自Programming Languages and Lambda Calc ...

  10. 代理ARP--善意的欺骗

    1. 代理ARP(Proxy ARP)是什么? 顾名思义,它指通过中间设备(通常为Router)代替其他主机响应ARP请求.对于没有配置默认网关的主机想要与其他网络的另一台主机通信时,网关收到源主机的 ...