P1553 数字反转(升级版)(JAVA)

题目背景

以下为原题面,仅供参考:

给定一个数,请将该数各个位上数字反转得到一个新数。

这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为 0 0 0(除非小数部分除了 0 0 0 没有别的数,那么只保留1个 0 0 0);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为 0 0 0),本次没有负数。

题目描述

给定一个数,请将该数各个位上数字反转得到一个新数。

这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。

  • 整数反转是将所有数位对调。

  • 小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。

  • 分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。

  • 百分数的分子一定是整数,百分数只改变数字部分。

输入格式

一个实数 s s s

输出格式

一个实数,即 s s s 的反转数

样例 #1

样例输入 #1

5087462

样例输出 #1

2647805

样例 #2

样例输入 #2

600.084

样例输出 #2

6.48

样例 #3

样例输入 #3

700/27

样例输出 #3

7/72

样例 #4

样例输入 #4

8670%

样例输出 #4

768%

提示

【数据范围】

  • 对于 25 % 25\% 25% 的数据, s s s 是整数,不大于 20 20 20 位;
  • 对于 25 % 25\% 25% 的数据, s s s 是小数,整数部分和小数部分均不大于 10 10 10 位;
  • 对于 25 % 25\% 25% 的数据, s s s 是分数,分子和分母均不大于 10 10 10 位;
  • 对于 25 % 25\% 25% 的数据, s s s 是百分数,分子不大于 19 19 19 位。

【数据保证】

  • 对于整数翻转而言,整数原数和整数新数满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数和原来的数字的最高位数字不应为零。

  • 对于小数翻转而言,其小数点前面部分同上,小数点后面部分的形式,保证满足小数的常见形式,也就是末尾没有多余的 0 0 0(小数部分除了 0 0 0 没有别的数,那么只保留 1 1 1 0 0 0。若反转之后末尾数字出现 0 0 0,请省略多余的 0 0 0

  • 对于分数翻转而言,分数不约分,分子和分母都不是小数。输入的分母不为 0 0 0。与整数翻转相关规定见上。

  • 对于百分数翻转而言,见与整数翻转相关内容。

数据不存在负数。

1.题目分析

输入整数,小数,分数,百分数,
整数直接反转,反转后前置有零的要去除。
小数单独反转整数和小数部分,反转后小数部分要去后置零,整数部分要去前置零。
分数单独反转分子分母部分,分子分母都要去除前置零。
百分数符号位不动,反转整数部分,反转后去除前置零。

值得注意的是,为零的情况要考虑清楚,整数可以为0,小数可以为0.0,但分数只能是分子为0,百分数也可以为0%。

2.题目思路

这里使用的是JAVA,输入字符串,判断包含的符号位:

如果包含小数点,将字符以小数点为分隔符切割成一个字符串数组,去除小数部分前置零,去除整数部分后置零,将字符串数组内的字符串转成StringBuilder类型,调用反转函数,判断整数或者小数部分只有零的情况,打印即可。

如果包含的是分数符号,一样切割成数组,去除分子分母部分后置零,使用反转函数,需要判断分子为零的情况。

如果包含的是百分号,切割成数组,去除后导零,数字反转后,判断百分数为零的情况。

其他就是整数,直接去除后导零,反转打印即可,判断为零的情况。

3.代码实现

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        if (str.contains(".")) {
            String[] xs = str.split("\\.");
            //去除小数部分前置零
            xs[1] = xs[1].replaceFirst("^0+", "");
            //去除整数部分后置零
            xs[0] = xs[0].replaceAll("0+$", "");
            StringBuilder sb1 = new StringBuilder(xs[0]);
            StringBuilder sb2 = new StringBuilder(xs[1]);
            //数字反转
            sb1.reverse();
            sb2.reverse();
            //整数或者小数部分只有零的情况
            if (sb2.length() == 0) {
                sb2.append("0");
            }
            if (sb1.length() == 0) {
                sb1.append("0");
            }
            System.out.println(sb1 + "." + sb2);
        } else if (str.contains("/")) {
            String[] fs = str.split("/");
            //去除分子分母部分后置零
            fs[0] = fs[0].replaceAll("0+$", "");
            fs[1] = fs[1].replaceAll("0+$", "");
            StringBuilder sb1 = new StringBuilder(fs[0]);
            StringBuilder sb2 = new StringBuilder(fs[1]);
            //数字反转
            sb1.reverse();
            sb2.reverse();
            //分子为零的情况
            if (sb1.length() == 0) {
                sb1.append("0");
            }
            System.out.println(sb1 + "/" + sb2);

        } else if (str.contains("%")) {
            String[] bfs = str.split("%");
            bfs[0] = bfs[0].replaceAll("0+$", "");
            StringBuilder sb = new StringBuilder(bfs[0]);
            sb.reverse();
            //百分数为零的情况
            if (sb.length() == 0) {
                sb.append("0");
            }
            System.out.println(sb + "%");

        } else {
            if (str.equals("0")) {
                System.out.println("0");
            }
            StringBuilder sb = new StringBuilder(str);
            sb.reverse();
            String sbString = sb.toString();
            String output = sbString.replaceFirst("^0+", "");
            System.out.println(output);
        }
    }
}

你可能感兴趣的:(刷题go,go,go,java,算法)