题目链接点击此处
题目描述
给定一个数,请将该数各个位上数字反转得到一个新数。

这次与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 数字反转相关推荐

  1. P1553 数字反转(升级版)

    P1553 数字反转(升级版) 温馨提示 1.在处理小数的时候注意处理末尾的0,反转后末尾不得有多余的0 (判断的时候 s[ i ] ! = ' 0 '  判断的是字符) 2.处理小数和分数的时候,要 ...

  2. 洛谷试炼场 P1553 数字反转(升级版)题解

    洛谷试炼场 P1553 数字反转(升级版)题解 [c] 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数. ...

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

    洛谷P1553 数字反转(升级版) 题目描述 输入格式 输出格式 输入输出样例 说明/提示 个人理解 整数 百分数 分数 小数 AC代码 写在最后 题目描述 给定一个数,请将该数各个位上数字反转得到一 ...

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

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

  5. [刷题之旅no14]P1553 数字反转(升级版)

    说实话好像很简单的样子,因为我并不需要真正地把这个东西反转,只需要用一个字符串存储,然后倒着打印出来就好了. 思路: 1.scanf%s读取 2.向后遍历,看下一位 如果是'\0' 说明是整数,此时记 ...

  6. P1553 数字反转(升级版)(字符串 模拟)

    题目链接:https://www.luogu.org/problem/P1553 思路概括:找到符号的位置标记,先反转前面的部分,再反转后面的部分 真的是改bug改到吐血 给大家列几个把我卡掉的样例( ...

  7. 【题解】P1553 数字反转(升级版)

    原题链接:点我跳转 此题思维难度不大,考察选手对于细节的把控. 本题分为四种情况: 整数 浮点数 分数 百分数 看似情况很多,实则需要做的操作是一样的.都是 反转 + 去掉前导0 + 可能的要去掉中间 ...

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

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

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

    题目链接 https://www.luogu.org/problemnew/show/P1553 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的 ...

最新文章

  1. LeetCode简单题之数组的度
  2. Java的File类
  3. FFT [TPLY]
  4. vue3.0中使用计算属性时报错
  5. spring发展历程
  6. Hbase架构与原理
  7. perl 正则表达式 引擎_Perl 5引擎概述
  8. C++工业设备日志记录系统
  9. win10关闭快速启动_Win10系统做了这3项优化,让你的电脑告别卡顿
  10. java 类似 ror的框架_RoR与Jdon Framework架构比较
  11. 游戏,CG音乐音效配音
  12. glassfish插件_安装和使用Glassfish
  13. UPDATE或者DELETE忘加WHERE条件的恢复
  14. 零基础能掌握seo知识吗
  15. linux连接wifi的方法
  16. websocket网络断开之后重连
  17. 场景,或许才是未来空间设计的关键词,可能是最接近元宇宙的空间体验? | 浅空间专栏...
  18. js将数组中相同项放在一个数组
  19. 【多校训练】2021HDU多校4
  20. 大众点评数据信息获取——字体反爬

热门文章

  1. 预约美发平台开发,美容美发店老板可以借鉴上门推拿模式
  2. 基于Golang TCP 开发网络游戏 CLI四川麻将 - 2.Tcp通讯
  3. android9.0耳机,疯米耳机app
  4. 如何用分区助手来进行分区U盘或外接硬盘【教你两步搞定】
  5. 【JS】:JS做的一个闹钟
  6. Cesium 通过primitive 添加垂直图片资源
  7. 100+款AI产品薅羊毛攻略(上)——轻轻松松节省几十万
  8. CAMIF : camera interface 摄像头接口 简介
  9. [FI业务流程] - 未清项管理 (XOPVW, XLGCLR, X_UJ_CLR)
  10. A9G GPS定位系统介绍(物联网、.NET Core web、Winform、Wpf、STM32)