P1553 数字反转
题目链接点击此处
题目描述
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为0(除非小数部分除了0没有别的数,那么只保留1个0);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为0),本次没有负数。
输入格式
一个数s
输出格式
一个数,即s的反转数
输入 #1
5087462
输出
2647805
输入 #2
600.084
输出
6.48
输入 #3
700/27
输出
7/72
输入 #4
8670%
输出
768%
说明/提示
所有数据:25%s是整数,不大于20位
25%s是小数,整数部分和小数部分均不大于10位
25%s是分数,分子和分母均不大于10位
25%s是百分数,分子不大于19位
(20个数据)
#include<bits/stdc++.h>
using namespace std;void reverse1(char *a, int len);
void reverse2(char *a, int len);
void reverse3(char *a, int len);
void reverse4(char *a, int len);char a[50], b[50], c[50];int main(void) {scanf("%s", a);int flag = 0;//flag 用来标记是哪种数int len = strlen(a);memset(b, 0, sizeof(b));memset(c, 0, sizeof(c));for (int i = 0; i < len; i++) {//因为不可能有这种0.1% ,题目上说 百分数的分子是整数,if (a[i] == '.') {//我是没明白,还是想简单点吧flag = 1;break;}else if (a[i] == '/') {flag = 2;break;}else if (a[i] == '%') {flag = 3;break;}}switch (flag) {case 0:reverse1(a, len);break;case 1:reverse2(a, len);break;case 2:reverse3(a, len);break;case 3:reverse4(a, len);break;}printf("%s\n", a);return 0;
}void reverse1(char *a, int len) {int t = 0, i, j;for (i = 0; a[i] == '0'; i++);for (j = i; j < len; j++)b[t++] = a[j];int k = 0;for (i = t - 1; i >= 0 && b[i] == '0'; i--);for (j = i; j >= 0; j--)a[k++] = b[j];if (i == -1 && k == 0) {//若整数全是0的话a[0] = '0';k = 1;}a[k] = '\0';memset(b, 0, sizeof(b));
}void reverse2(char *a, int len) {int t1 = 0, i, j, k;for (i = 0; a[i] == '0'; i++);for (k = i; a[k] != '.'; k++)b[t1++] = a[k];int t2 = 0;for (i = k + 1; a[i] == '0'; i++);//小数点后面连续的0 在反转后都是不存在的for (j = i; j < len; j++)c[t2++] = a[j];//想的实在麻烦了 直接一个一个部分讨论if (t1 == 0 && t2 == 0) {a[0] = '0';a[1] = '.';a[2] = '0';a[3] = '\0';}else if (t1 == 0 && t2 != 0) {if (t1 == 0)//左边就没有非零数a[0] = '0';a[++t1] = '.';//前面的t2for (i = t2 - 1; i >= 0; i--)a[++t1] = c[i];a[++t1] = '\0';}else if (t1 != 0 && t2 == 0) {int t = 0;for (i = t1 - 1; b[i] == '0'; i--);//比如500.08 那么倒过来的话,500的两个0是不需要的for (j = i; j >= 0; j--)a[t++] = b[j];if (t2 == 0) {a[t] = '.';//因为k的时候 a[k]='.';a[t + 1] = '0';a[t + 2] = '\0';}}else if (t1 != 0 && t2 != 0) {int t = 0;for (i = t1 - 1; i >= 0 && b[i] == '0'; i--);//比如500.08 那么倒过来的话,500的两个0是不需要的for (j = i; j >= 0; j--)a[t++] = b[j];a[t++] = '.';for (i = t2 - 1; i >= 0; i--)a[t++] = c[i];a[t++] = '\0';}memset(b, 0, sizeof(b));memset(c, 0, sizeof(c));
}void reverse3(char *a, int len) {int t1 = 0, i, j, k;for (i = 0; a[i] == '0'; i++);for (k = i; a[k] != '/'; k++)b[t1++] = a[k];int t2 = 0;for (i = k + 1; a[i] == '0'; i++);for (j = i; j < len; j++)c[t2++] = a[j];int t = 0;for (i = t1 - 1; i >= 0 && b[i] == '0'; i--);for (j = i; j >= 0; j--)a[t++] = b[j];if (i == -1 && t == 0) {//当分子为0,就不用管其他的了,直接是0a[t++] = '0';}a[t++] = '/';for (i = t2 - 1; c[i] == '0'; i--);for (j = i; j >= 0; j--)a[t++] = c[j];a[t] = '\0';memset(b, 0, sizeof(b));memset(c, 0, sizeof(c));
}void reverse4(char *a, int len) {int t = 0, i, j;for (i = 0; a[i] == '0'; i++);for (j = i; j < len; j++)b[t++] = a[j];int k = 0;for (i = t - 2; i >= 0 && b[i] == '0'; i--);for (j = i; j >= 0; j--)a[k++] = b[j];if (i == -1 && k == 0) {//若整数全是0的话a[0] = '0';k = 1;}a[k++] = '%';a[k] = '\0';memset(b, 0, sizeof(b));
}
P1553 数字反转相关推荐
- P1553 数字反转(升级版)
P1553 数字反转(升级版) 温馨提示 1.在处理小数的时候注意处理末尾的0,反转后末尾不得有多余的0 (判断的时候 s[ i ] ! = ' 0 ' 判断的是字符) 2.处理小数和分数的时候,要 ...
- 洛谷试炼场 P1553 数字反转(升级版)题解
洛谷试炼场 P1553 数字反转(升级版)题解 [c] 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数. ...
- 洛谷P1553 数字反转(升级版)
洛谷P1553 数字反转(升级版) 题目描述 输入格式 输出格式 输入输出样例 说明/提示 个人理解 整数 百分数 分数 小数 AC代码 写在最后 题目描述 给定一个数,请将该数各个位上数字反转得到一 ...
- 洛谷---P1553 数字反转(升级版)
题目描述: 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数. 1.整数反转是将所有数位对调. 2.小数反转是把整数 ...
- [刷题之旅no14]P1553 数字反转(升级版)
说实话好像很简单的样子,因为我并不需要真正地把这个东西反转,只需要用一个字符串存储,然后倒着打印出来就好了. 思路: 1.scanf%s读取 2.向后遍历,看下一位 如果是'\0' 说明是整数,此时记 ...
- P1553 数字反转(升级版)(字符串 模拟)
题目链接:https://www.luogu.org/problem/P1553 思路概括:找到符号的位置标记,先反转前面的部分,再反转后面的部分 真的是改bug改到吐血 给大家列几个把我卡掉的样例( ...
- 【题解】P1553 数字反转(升级版)
原题链接:点我跳转 此题思维难度不大,考察选手对于细节的把控. 本题分为四种情况: 整数 浮点数 分数 百分数 看似情况很多,实则需要做的操作是一样的.都是 反转 + 去掉前导0 + 可能的要去掉中间 ...
- 数字反转(升级版)(洛谷-P1553)
题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调:小数反转是把整数部分的数反转, ...
- 洛谷P1553 数字翻转(升级版)
题目链接 https://www.luogu.org/problemnew/show/P1553 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的 ...
最新文章
- LeetCode简单题之数组的度
- Java的File类
- FFT [TPLY]
- vue3.0中使用计算属性时报错
- spring发展历程
- Hbase架构与原理
- perl 正则表达式 引擎_Perl 5引擎概述
- C++工业设备日志记录系统
- win10关闭快速启动_Win10系统做了这3项优化,让你的电脑告别卡顿
- java 类似 ror的框架_RoR与Jdon Framework架构比较
- 游戏,CG音乐音效配音
- glassfish插件_安装和使用Glassfish
- UPDATE或者DELETE忘加WHERE条件的恢复
- 零基础能掌握seo知识吗
- linux连接wifi的方法
- websocket网络断开之后重连
- 场景,或许才是未来空间设计的关键词,可能是最接近元宇宙的空间体验? | 浅空间专栏...
- js将数组中相同项放在一个数组
- 【多校训练】2021HDU多校4
- 大众点评数据信息获取——字体反爬
热门文章
- 预约美发平台开发,美容美发店老板可以借鉴上门推拿模式
- 基于Golang TCP 开发网络游戏 CLI四川麻将 - 2.Tcp通讯
- android9.0耳机,疯米耳机app
- 如何用分区助手来进行分区U盘或外接硬盘【教你两步搞定】
- 【JS】:JS做的一个闹钟
- Cesium 通过primitive 添加垂直图片资源
- 100+款AI产品薅羊毛攻略(上)——轻轻松松节省几十万
- CAMIF : camera interface 摄像头接口 简介
- [FI业务流程] - 未清项管理 (XOPVW, XLGCLR, X_UJ_CLR)
- A9G GPS定位系统介绍(物联网、.NET Core web、Winform、Wpf、STM32)