洛谷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. Python 练习: 简单的用户登录判断

    _user = "klvchen" _passwd = " counter = 0 while counter < 3: username = raw_input( ...

  2. node 跨域问题

    node跨域有很多方法 1.引入 中间件cors 我觉的最好的方法 var express=require('express'); var cors=require('cors'); var app= ...

  3. [转]Serif和Sans-serif字体的区别

    在西方国家罗马字母阵营中,字体分为两大种类:Sans Serif和Serif,打字机体虽然也属于Sans Serif,但由于是等宽字体,所以另外独立出Monospace这一种类,例如在Web中,表示代 ...

  4. Spring Boot Oauth2缓存UserDetails到Ehcache

    在Spring中有一个类CachingUserDetailsService实现了UserDetailsService接口,该类使用静态代理模式为UserDetailsService提供缓存功能.该类源 ...

  5. 【读书笔记】iOS-手势识别

    一,事件处理机制 事件是当用户手指触及屏幕,或地屏幕上滑动,或摇晃设备等时候,系统不断地把这些事件通过消息发送给应用程序对象.在iOS设备中能够捕获的事件有3种:触摸事件,移动事件和多媒体远程控制事件 ...

  6. Google Chrome 下载&绿化&增强

    Chrome下载 Google Chrome 已经可以在线更新,虽然比较慢! 国内常用的更新地址有两处:chromedownloads 和 shuax(耍下): https://www.chromed ...

  7. vue 环境的搭建及初始化项目

    其实超级简单,虽然网上很多,但是我顺便记录下相当于做笔记吧 1nodejs 的安装, 在node官网下载,点击安装,安装的时候最好选择路径在d盘 2设置环境变量 我的电脑-->属性-->系 ...

  8. 51Testing专访史亮:测试人员在国外

    不久前,我接受了51Testing的访问,讨论了软件测试的一些问题.以下是全文. 1.史亮老师,作为我们51Testing的老朋友,能和我们说说您最近在忙些什么吗? 自2011年起,我加入Micros ...

  9. couldn't locate lint-gradle-api-26.1.2.jar for flutter project

    Could not find com.android.tools.lint:lint-gradle:26.1.2 当我尝试构建发行版本APK 时导致报这种错误,无法发行,针对自己的项目作出了相关修改, ...

  10. 【Java入门提高篇】Day32 Java容器类详解(十四)ArrayDeque详解

    今天来介绍一个不太常见也不太常用的类——ArrayDeque,这是一个很不错的容器类,如果对它还不了解的话,那么就好好看看这篇文章吧. 看完本篇,你将会了解到: 1.ArrayDeque是什么? 2. ...