蓝桥杯——特殊回文数

蓝桥杯——特殊回文数

问题描述

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();
		}
	}

}

在这里插入图片描述

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值