蓝桥杯真题之:特殊回文数
题目:
特殊回文数
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
输入一行,包含一个正整数n。
输出格式
按从小到大的顺序输出满足条件的整数,每个整数占一行。
样例输入
52
样例输出
899998
989989
998899
数据规模和约定
1<=n<=54。
不多说:题目的大概意思是:从10000到999999中找到回文数 并找到回文数中的每一位
把他们加起来,看是否等于用户输入的那个
废话我就不多说,直接上代码:
import java.util.ArrayList;
import java.util.Scanner;
/**
*
* @author: HaHa
* @date: 2022年3月15日 下午3:41:58
* @project: 特殊回文数
*/
public class Test04 {
//头部指针
private static int begin;
//尾部指针
private static int end;
//用户输入的数据,存为全局变量
private static int data;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//用户输入
data = sc.nextInt();
//存储回文的数字(字符串类型)
ArrayList<String> arr = new ArrayList<String>();
//直接暴力安排上
for (int i = 10001; i < 999999; i++) {
//把数字转成string类型
String num = Integer.toString(i);
//初始化头部指针
begin = 0;
//初始化尾部指针(减一是为了索引不越界)
end = num.length() - 1;
//如果头部指针指向的字符和尾部指针指向的字符相等
while (num.charAt(begin) == num.charAt(end)) {
//是回文数
if (begin == num.length() / 2) {
//添加到集合中
arr.add(num);
//直接下一步:判断每一位的累加和是否等于用户输入的
// data
break;
}
//指针移动
begin++;
end--;
}
}
//遍历集合
for (int i = 0; i < arr.size(); i++) {
//因为存放的是字符串
//从集合中拿出元素,利用split方法进行分割
//转换成一个string类型的数组
String[] split = arr.get(i).split("");
//字符串的长度判断
if (split.length == 5) {
//拿到单个字符串的前3位
int a = Integer.parseInt(split[0]);
int b = Integer.parseInt(split[1]);
int c = Integer.parseInt(split[2]);
//判断是否符合要求
if (2 * (a + b) + c == data) {
System.out.println(arr.get(i));
}
}
//不多说👍
if (split.length == 6) {
int a = Integer.parseInt(split[0]);
int b = Integer.parseInt(split[1]);
int c = Integer.parseInt(split[2]);
if (2 * (a + b + c) == data) {
System.out.println(arr.get(i));
}
}
}
}
}
基本上思路就是这样