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的特殊情况,比如: