题解 P1553 数字反转(升级版)(Java)

题目来源:洛谷P1553


题目描述

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

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

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

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

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

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

输入格式

一个数 ss

输出格式

一个数,即 ss 的反转数

输入输出样例

输入 #1输出 #1
5087462
2647805
输入 #2输出 #2
600.084
6.48
输入 #3输出 #3
700/27
7/72
输入 #4输出 #4
8670%
768%

说明/提示

所有数据:25%s是整数,不大于20位

25%s是小数,整数部分和小数部分均不大于10位

25%s是分数,分子和分母均不大于10位

25%s是百分数,分子不大于19位

(20个数据)

数据保证:

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

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

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

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

数据不存在负数。


题解

在之前的题目中,我们可以实现对整数进行数字翻转。那么,我们能不能把一个数前后拆成两个整数来看呢?

在做整数的反转时,我的方法是[1] 

  1. 输入一个字符串。
  2. 对该字符串进行反转。
  3. 用Long类的valueOf(string)方法将字符串转为整数。
  4. 用String类的valueOf(value)方法将整数转为字符串。

显然,第3 4步的作用是去除翻转后数字前多余的零

Num = String.valueOf(Long.valueOf(ReTurn(Num)));

    /*
    函数功能:翻转一个字符串
    参数:字符串
    返回值:字符串
     */
    public static String ReTurn(String text) {
        char[] textList = new char[text.length()];
        int i;
        for (i = 0; i <= textList.length - 1; i++) {
            textList[i] = text.charAt(i);
        }
        int s, e;
        char t;
        s = 0;
        e = textList.length - 1;
        for (; e - s > 0; s++, e--) {
            t = textList[s];
            textList[s] = textList[e];
            textList[e] = t;
        }
        String reTxt;
        reTxt = String.valueOf(textList);
        return reTxt;
    }

现在看一下这道题:

首先,我们需要一个方法,可以判断输入的数是整数、小数、分数、还是百分数。

小数中一定含有“.”,分数中一定含有“/”,百分数中一定含有“%”

使用String类提供的contains(string)方法,即可判断该数的类型。

String类方法:contains(s1)

描述:如果s1是该字符串的字字符串,返回true

    /*
    函数功能:判断一个数字的类型,1为整数,2为小数,3为分数,4为百分数
    参数:字符串
    返回值:整数
     */
    public static int NumType(String Num) {
        if (Num.contains("."))
            return 2;//小数
        else if (Num.contains("/"))
            return 3;//分数
        else if (Num.contains("%"))
            return 4;//百分数
        else
            return 1;//整数
    }

如果是整数:

直接使用[1]

如果是小数:

  1. 使用String类的indexOf(string)insubstring(beinIndex,endIndex)方法返回小数的整数部分。
  2. 对整数部分使用[1]。
  3. 使用String类的indexOf(string)insubstring(beinIndex)方法返回小数的小数部分。
  4. 对小数部分依次使用[1]的1,3,4,2步(更改步骤顺序的目的是除去翻转后数字后多余的零)。
  5. 使用String类的contains(string)方法将整数部分,“.”和小数部分连接。

String类方法:indexOf(ch)

描述:返回字符串中第一个出现ch的下标。如果没有匹配的,返回-1

String类方法:insubstring(beinIndex)

描述:返回该字符串的字串,从指定位置beginIndex的字符开始到字符串的结尾

 String类方法:insubstring(beinIndex,endIndex)

描述:返回该字符串的字串,从指定位置beginIndex的字符开始到下标为endIndex - 1的字符

Num = String.valueOf(Long.valueOf(ReTurn(Num.substring(0, Num.indexOf('.')))))
                        .concat(".").concat(ReTurn(String.valueOf(Long.valueOf(Num.substring(Num.indexOf('.') + 1)))));

如果是分数:

  1. 使用String类的indexOf(string)insubstring(beinIndex,endIndex)方法返回分数的分子部分。
  2. 对分子部分使用[1]。
  3. 使用String类的indexOf(string)insubstring(beinIndex)方法返回分数的分母部分。
  4. 对分母部分使用[1]。
  5. 使用String类的contains(string)方法将分子部分,“/”和分母部分连接。
Num = String.valueOf(Long.valueOf(ReTurn(Num.substring(0, Num.indexOf('/')))))
                        .concat("/").concat(String.valueOf(Long.valueOf(ReTurn(Num.substring(Num.indexOf('/') + 1)))));

如果是百分数:

  1. 使用String类的indexOf(string)insubstring(beinIndex,endIndex)方法返回百分数百分号前面的数字部分。
  2. 对数字部分使用[1]。
  3. 使用String类的contains(string)方法将数字部分和“%”连接。
Num = String.valueOf(Long.valueOf(ReTurn(Num.substring(0, Num.indexOf('%'))))).concat("%");

完整代码如下:

import java.util.Scanner;

public class P1553 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String Num;
        Num = input.nextLine();
        switch (NumType(Num)) {
            case 1://整数
                Num = String.valueOf(Long.valueOf(ReTurn(Num)));
                break;
            case 2://小数
                Num = String.valueOf(Long.valueOf(ReTurn(Num.substring(0, Num.indexOf('.')))))
                        .concat(".").concat(ReTurn(String.valueOf(Long.valueOf(Num.substring(Num.indexOf('.') + 1)))));
                break;
            case 3://分数
                Num = String.valueOf(Long.valueOf(ReTurn(Num.substring(0, Num.indexOf('/')))))
                        .concat("/").concat(String.valueOf(Long.valueOf(ReTurn(Num.substring(Num.indexOf('/') + 1)))));
                break;
            case 4://百分数
                Num = String.valueOf(Long.valueOf(ReTurn(Num.substring(0, Num.indexOf('%'))))).concat("%");
                break;
        }
        System.out.print(Num);
    }

    /*
    函数功能:判断一个数字的类型,1为整数,2为小数,3为分数,4为百分数
    参数:字符串
    返回值:整数
     */
    public static int NumType(String Num) {
        if (Num.contains("."))
            return 2;//小数
        else if (Num.contains("/"))
            return 3;//分数
        else if (Num.contains("%"))
            return 4;//百分数
        else
            return 1;//整数
    }

    /*
    函数功能:翻转一个字符串
    参数:字符串
    返回值:字符串
     */
    public static String ReTurn(String text) {
        char[] textList = new char[text.length()];
        int i;
        for (i = 0; i <= textList.length - 1; i++) {
            textList[i] = text.charAt(i);
        }
        int s, e;
        char t;
        s = 0;
        e = textList.length - 1;
        for (; e - s > 0; s++, e--) {
            t = textList[s];
            textList[s] = textList[e];
            textList[e] = t;
        }
        String reTxt;
        reTxt = String.valueOf(textList);
        return reTxt;
    }
}


引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老刘莱国瑞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值