蓝桥杯_特殊回文数Java

该博客讨论了一种特殊回文数的生成问题,即寻找所有和为给定值n的五位和六位回文数。作者通过Java编程实现了这一算法,考虑了n为奇数和偶数两种情况,并优化了存储回文数的数组大小。博客内容包含了代码实现、逻辑分析以及优化后的总结,特别提到了当n为偶数时不存在五位回文数的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

特殊回文数

问题描述

123321是一个非常特殊的数,它从左边读和从右边读是一样的。
  输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。

输入格式

输入一行,包含一个正整数n。

输出格式

按从小到大的顺序输出满足条件的整数,每个整数占一行。

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int a, b, c;//个位数a,十位数b,百位数c;
		int y[] = new int[999];//建立数组用于存储符合条件的回文数
		int z = 0;
		for (int i = 1; i <= 9; i++) {//个位和最高位为a,但不能为0;1=<a<=9;
			a = i;
			if(n%2==0) {
				for (int j = 0; j <= n / 2 - a && j <= 9; j++) {//十位b
					b = j;
	
					c = n / 2 - a - b;
					if (c >= 0 && c <= 9) {
						y[z] = a * 100000 + b * 10000 + c * 1000 + c * 100 + b * 10 + a;
						z++;
					}
	
					c = n - 2 * a - 2 * b;
					if (c >= 0 && c <= 9) {
						y[z] = a * 10000 + b * 1000 + c * 100 + b * 10 + a;
						z++;
					}
				}
			}else {
				for (int j = 0; j <= n  - 2*a && j <= 9; j++) {
					b = j;
					c = n - 2 * a - 2 * b;
					if (c >= 0 && c <= 9) {
						y[z] = a * 10000 + b * 1000 + c * 100 + b * 10 + a;
						z++;
					}
				}
			}
		}
		Arrays.sort(y);//回文数数组y排序,从小到大
		for (int i = 0; i < y.length; i++) {
			if (y[i] > 0) {//遍历输出各个数据
				System.out.println(y[i]);
			}

		}
	}
}

感悟总结
  1. 建立存储回文数的数组时,未知满足条件的回文数个数,所以我创建了一个999的数组,因为是5和6位数的回文数,最大个数也就是999个,不过存储空间上有些大,可以相应缩小一定的空间,以减少空间复杂度。
  2. 输出格式是有要求的,所有最后一定要符合要求输出(这里是从小到大输出)
  3. 就是当n为偶数时,是不存在5位数的回文数的,所以要分情况讨论了,因为此时n/2为浮点类型自动转化为了int类型,此时就会忽略除不尽的情况

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int a, b, c;//个位数a,十位数b,百位数c;
		int y[] = new int[999];//建立数组用于存储符合条件的回文数
		int z = 0;
		for (int i = 1; i <= 9; i++) {//个位和最高位为a,但不能为0;1=<a<=9;
			a = i;
			
				for (int j = 0; j <= n  - 2*a && j <= 9; j++) {//十位b
					b = j;
					if(n%2==0) {
						c = n/2-a-b;
						if (c >= 0 && c <= 9) {
							y[z] = a * 100000 + b * 10000 + c * 1000 + c * 100 + b * 10 + a;
							z++;
						}
					}
					
					c = n - 2 * a - 2 * b;
					if (c >= 0 && c <= 9) {
						y[z] = a * 10000 + b * 1000 + c * 100 + b * 10 + a;
						z++;
					}
				}
			
		}
		Arrays.sort(y);//回文数数组y排序,从小到大
		for (int i = 0; i < y.length; i++) {
			if (y[i] > 0) {//遍历输出各个数据
				System.out.println(y[i]);
			}

		}
	}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值