MT2004 购买数字

该文章介绍了一个数学问题,寻找用给定金额能购买的最大回文数。通过Java代码实现,首先处理输入的前导零,然后使用枚举方法,对比并调整数组中的数字以找到最大回文数。在处理过程中,考虑了高位数字小于等于或大于低位数字的情况,并处理了首位为0的特殊情况。
摘要由CSDN通过智能技术生成

 1.题目

小码哥是数学王国的一位居民,最近他迷上了回文数,决定去数字商店购买一个回文数。小码哥是个比较贪心的孩子,他想要购买自己能买到的最大的回文数,已知每个数的价格是这个数本身(即1是1块钱,2是2块钱…)。

小码哥家由于是个数学世家,小码哥的零花钱也比别人多一点点,目前小码哥手上有nn块钱,小码哥想问你他能买到的最大的回文数是多少?

格式

输入格式:

一个正整数nn,表示小码哥的零花钱,其中可能有前导零。

输出格式:

输出一个正整数,表示小码哥能买到的最大的回文数。

样例 1

输入:

648

输出:

646
备注

1≤n≤10^200,数字的长度也小于等于200。

本题相关知识点: 算法基础:枚举

题目来源:码蹄集

 2.代码

import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String s = input.nextLine();
        //前导零的处理
        int index = 0;
        for (; index < s.length(); ++index) {
            if (s.charAt(index) != '0') break;
        }
        s = s.substring(index, s.length());
        char[] arr = s.toCharArray();
        //获取最大回文数
        for (int i = 0; i < arr.length / 2; ++i) {
            if (arr[i] > arr[arr.length - 1 - i]) {
                for (int k = arr.length - 2 - i; k >= 0; --k) {
                    if (arr[k] > '0') {
                        --arr[k];
                        break;
                    } else {
                        arr[k] = '9';
                    }
                }
            }
            arr[arr.length - 1 - i] = arr[i];
        }
        //输出回文数
        if (arr[0] <= '0') {
            for (int i = 0; i < arr.length - 1; ++i) {
                System.out.print(9);
            }
        } else {
            for (char i : arr) {
                System.out.print(i);
            }
        }
        input.close();
    }
}

 3.思路

 从题目中可获得回文数所在范围的上限,要想获得最大的回文数,则需要保持高位的数字尽可能的不变,通过改变地位数字的来达到效果。

对于高位数字小于等于低位数字的情况:

对于高位数字大于低位数字的情况:

 在第二种情况的变化过程中,我们不难想到,可能会出现多个0,向前借位,最终形成一种首位为0的特殊情况,比如:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

厂里英才

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

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

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

打赏作者

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

抵扣说明:

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

余额充值