特殊回文数
问题描述
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]);
}
}
}
}
感悟总结
- 建立存储回文数的数组时,未知满足条件的回文数个数,所以我创建了一个999的数组,因为是5和6位数的回文数,最大个数也就是999个,不过存储空间上有些大,可以相应缩小一定的空间,以减少空间复杂度。
- 输出格式是有要求的,所有最后一定要符合要求输出(这里是从小到大输出)
- 就是当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]);
}
}
}
}