栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

题解 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

    
    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);
    }

    
    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;
    }
}


引用

梁勇,戴开宇. 数学函数、字符和字符串. 《Java语言程序设计与数据结构》2018P1553 数字反转 (升级版).  洛谷 [引用日期2022-01-18]

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/708286.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号