洛谷—字符串—数字反转

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

题目背景

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

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

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

题目描述

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

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

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

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

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

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

import java.util.Scanner;

/**
 * 数字反转,输出看0
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        if (str.contains(".")) {
            //切割、小数部分除了0没有别的数,那么只保留1个0,否则不保留末尾的0
            String[] split = str.split("[.]");
            String a = inverse(split[0].toCharArray());
            String b = inverse(split[1].toCharArray());
            //插板子,第一位不插,插了第一次,如果下一位不是0,break;
            int index = -1;
            for (int i = b.length() - 1; i >= 1 ; i--) {
                if (b.charAt(i) == '0'){
                    index = i;
                    if (b.charAt(i-1) != '0'){
                        break;
                    }
                }
            }
            if (index != -1){
                b = b.substring(0, index);
            }
            String res = a + "." + b;
            System.out.println(res);
        } else if (str.contains("/")) {
            //切割
            String[] split = str.split("[/]");
            String a = inverse(split[0].toCharArray());
            String b = inverse(split[1].toCharArray());
            System.out.println(a + "/" + b);
        } else if (str.contains("%")) {
            //截取
            char[] chs = str.substring(0,str.length() - 1).toCharArray();
            System.out.println(inverse(chs) + "%");
        } else {
            char[] chs = str.toCharArray();
            System.out.println(inverse(chs));
        }
    }
    //反转数字
    public static String inverse(char[] chs){
        for (int i = 0,j = chs.length - 1; i < j ; i++,j--) {
            char ch = chs[i];
            chs[i]  = chs[j];
            chs[j] = ch;
        }
        //转为数字 --> 最大20位,超出long 2^64精度
        BigInteger m = BigInteger.valueOf(1);
        BigInteger a = BigInteger.valueOf(0);
        BigInteger x;
        BigInteger s = BigInteger.valueOf(10);
        for (int i = chs.length - 1; i >= 0; i--) {
            x = BigInteger.valueOf(chs[i] - '0');
            a = a.add(x.multiply(m));
            m = m.multiply(s);
        }
        return "" + a;
    }
}




  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值