洛谷P1553 数字翻转(升级版)
洛谷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 数字翻转(升级版)的更多相关文章
- 洛谷P1553数字反转升级版
题目链接:https://www.luogu.org/problemnew/show/P1553
- 洛谷 P1553 数字反转(升级版)【字符串+STL stack】
P1553 数字反转(升级版) 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调 ...
- 洛谷 P1553 数字反转(升级版)
P1553 数字反转(升级版) 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调 ...
- (水题)洛谷 - P1553 - 数字反转(升级版) - 字符串格式转换
https://www.luogu.org/problemnew/show/P1553 忘记给整数加上前导零去除的代码了.其实不去也可以,额外的进位用一个carry另外存起来就好. #include& ...
- (Java实现) 洛谷 P1553 数字反转(升级版)
题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调:小数反转是把整数部分的数反转, ...
- 洛谷P1553 数字反转(升级版)
题目简介 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对 ...
- 洛谷P1118 数字三角形游戏
洛谷1118 数字三角形游戏 题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直 ...
- 洛谷 P5660 数字游戏 & [NOIP2019普及组]
传送门 洛谷改域名了QAQ 解题思路 没什么好说的,一道红题,本不想发这篇博客 ,但还是尊重一下CCF吧QAQ,怎么说也是第一年CSP呢! 用getchar一个个读入.判断.累加,最后输出即可. 不过 ...
- 洛谷——P1618 三连击(升级版)
P1618 三连击(升级版) 题目描述 将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”. //感谢 ...
随机推荐
- JavaScript 频繁发射事件处理的优化 --- 函数节流/事件稀释
引子:昨天面试时面试官问了如何实现一个固定导航栏,在我答完后面试官问我可能存在哪些问题,如何优化? 这个问题我答得不太好,但现在回想起来应该有两个问题: 1. 把 fixbar元素 position: ...
- ajax小知识
1.ajax发送get请求时,需要注意如下情况: var uri="http://127.0.0.1:8071/springmvcdemo/bigdataapi/publishdata&qu ...
- JavaWeb:jsp
本文内容: JSP的介绍 jsp的使用 EL表达式 JSTL的使用 首发日期:2018-06-18 JSP的介绍: JSP全称Java Server Pages. 与静态网页格式的html不同的是,j ...
- Python:BeautifulSoup移除某些不需要的属性
很久之前,我看到一个问题,大概是: 他爬了一段html,他获取下了所需的部分(img标签部分),但是不想保留img标签的某些属性, 比如 <img width="147" h ...
- HttpClient与浏览器调用服务接口差异
我用httpclient访问接口,统计图有些不均匀,差距较大 ,有时只有几十毫秒,下图看到这种情况占多数,600-800毫秒之间的算是浏览器正常的产生调用接口的时间耗时 然后用jmeter跑时都是均值 ...
- EntityFramework Code-First 简易教程(七)-------领域类配置之Fluent API
Fluent API配置: 前面我们已经了解到使用DataAnotations特性来覆写Code-First默认约定,现在我们来学习Fluent API. Fluent API是另一种配置领域类的方法 ...
- 如何猜出 Y combinator
先约定几个记号: 定义用一个冒号加等号表示":=", 表达式全等用两个等号表示"==", 归约意义上的相等用一个等号表示"="," ...
- 监控.net 网站 Glimpse
使用Nuget 安装Glimpse 安装好后,config会默认添加几个节点 安装好之后 只需要浏览器输入 网站/Glimpse.axd 再次进入网站 就可以查看(ajax sql session ...
- Android UI开发神兵利器之Android Action Bar Style Generator
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/x359981514/article/details/26283129 ActionBar是3.0后的 ...
- centos7下安装docker(3.2创建镜像build)
通过Dockerfile创建镜像 注:这个Dockerfile一开始真的不知道是在哪来的,还以为是在官网下载下来得(当然网上也有很多dockerfile的模板,参考:https://hub.docke ...