洛谷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. 洛谷P3346 [ZJOI2015]诸神眷顾的幻想乡(广义后缀自动机)

    题意 题目链接 Sol 广义SAM的板子题. 首先叶子节点不超过20,那么可以直接对每个叶子节点为根的子树插入到广义SAM中. 因为所有合法的答案一定是某个叶子节点为根的树上的一条链,因此这样可以统计 ...

  2. 【读书笔记】iOS-button只显示在一个界面的右下角,不管界面大小怎么变化(xib,没有使用自动布局)(一)

    一,新建立一个工程,Hello,如图所示. 二,Xcode--->New--->File--->FirstViewController---->选中Also create XI ...

  3. docker-使用Dockerfile制作镜像

    最近项目中有使用docker,组内做了关于docker的培训,然后自己跟着研究了一下,大概了解如何使用.我是基于tomcat镜像制作(不需要安装jdk,配置环境变量),基于centos镜像制作需要安装 ...

  4. 如今领占主导地位的19种AI技术!

    如今领占主导地位的19种AI技术! http://blog.itpub.net/31542119/viewspace-2212797/ 深度学习的突破将人工智能带进全新阶段. 2006 年-2015 ...

  5. Android学习笔记----天地图API开发之UnsatisfiedLinkError

    由于在jniLibs目录下移除了x86的相关so文件,后来又因为需要在PC模拟器上调试,将该文件夹恢复后,增加了天地图的sdk,却忘记将libMapEngine.so文件同时拷贝至x86目录下,导致如 ...

  6. (网页)javascript如何用递归写一个简单的树形结构

    转自博客园: 现在有一个数据,需要你渲染出对应的列表出来: var data = [ {"id":1}, {"id":2}, {"id":3 ...

  7. 安装mysql(macos系统)

    1.到官网下载,直接百度"mysql"即可找到 2.双击安装包,一路安装即可 3.然后进到系统设置 4.接下来 输入coho的用户密码 设置root用户的密码 切换root用户,v ...

  8. [20180718]拷贝数据文件从dg库.txt

    [20180718]拷贝数据文件从dg库.txt 1.测试环境:SCOTT@book> @ ver1PORT_STRING                    VERSION        B ...

  9. redhat5 安装mysql 5.6

    在官网找到下载链接 http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-5.6.19-1.rhel5.x86_64.rpm-bundle.tar wg ...

  10. Excel两列查找重复值

    判断A列的值在B列是否存在,如果存在则输出“yes” 在C1单元格使用如下公式: =IF(COUNTIF(A:A,B2)>0,"yes","")