蓝桥杯——特殊回文数

蓝桥杯——特殊回文数

问题描述

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

输入格式

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

输出格式

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

样例输入

52

样例输出

899998
989989
998899

数据规模和约定

1<=n<=54。

对人友好对机器不友好的解法:暴力**

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		for (int i = 10000; i < 999999; i++) {
			StringBuilder sb = new StringBuilder();
			String str = sb.append(String.valueOf(i)).toString();
			String str1 = sb.reverse().toString();
			if (str.equals(str1)) {
				int sum = 0;
				int m = i;
				while (m > 0) {
					sum += m % 10;
					m = m / 10;
				}
				if (sum == n) {
					System.out.println(i);
				}
			}
		}
	}
}

蓝桥杯——特殊回文数
稍微用了脑子的做法:我们分析一下回文数n,如果是五位回文数则为XYZXY格式,则中间的Z的取值范围(0-9),XY的取值范围为(10-99),然后让n - Z = (X + Y ) * 2,最后拼接就OK,如果是六位回文数XYZZYX,则XYZ的取值的范围(100-999),找到X + Y + Z = n / 2,最后拼接就OK。注意如果是五位,记得排序。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		List<Integer> list = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++) {
			if ((n - i) % 2 == 1)
				continue;
			else {
				int temp = (n - i) / 2;
				for (int j = 10; j < 100; j++) {
					int x = j / 10;
					int y = j % 10;
					if (x + y == temp) {
						list.add(10000 * x + 1000 * y + 100 * i + 10 * y + x);
					}
				}
			}
		}
		if (!list.isEmpty()) {
			Collections.sort(list);
			for (int i : list) {
				System.out.println(i);
			}
		}
		if (n % 2 == 0) {
			n = n / 2;
			for (int j = 100; j < 1000; j++) {
				int x = j / 100;
				int y = (j / 10) % 10;
				int z = j % 10;
				if (x + y + z == n) {
					System.out.println(100000 * x + 10000 * y + 1000 * z + 100 * z + 10 * y + x);
				}
			}
		}
	}

}

蓝桥杯——特殊回文数
后来仔细想了想的做法:自己是不是傻?n有两种可能 X + Y + Z + Y+ X = 2 * (X + Y) + Z = n或者 X +Y +Z + Z + Y + X = 2 * ( X + Y + Z) = n,XYZ的取值的范围(100-999),我只需要判断以上两种情况就可以,两者的区别就是加不加Z。注意需要排序。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		try {
			int n = input.nextInt();
			List<Integer> list = new ArrayList<Integer>();
			for (int j = 100; j < 1000; j++) {
				int x = j / 100;
				int y = (j / 10) % 10;
				int z = j % 10;
				if (2 * (x + y) + z == n)
					list.add(10000 * x + 1000 * y + 100 * z + 10 * y + x);
				if (2 * (x + y + z) == n)
					list.add(100000 * x + 10000 * y + 1000 * z + 100 * z + 10 * y + x);
			}
			if (!list.isEmpty()) {
				Collections.sort(list);
				for (int i : list)
					System.out.println(i);
			}
		} catch (Exception e) {
			input.close();
		}
	}

}

蓝桥杯——特殊回文数