基础练习 特殊回文数
时间限制:1.0s 内存限制:512.0MB
问题描述
123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
输入一行,包含一个正整数n。
输出格式
按从小到大的顺序输出满足条件的整数,每个整数占一行。
样例输入
52
样例输出
899998
989989
998899
989989
998899
数据规模和约定
1<=n<=54。
import java.util.Scanner;
/**
*
* @author hhit.soft141.xxf
* @date 2017-1-31
* 注释:求6位数时可以利用减治法的思想优化算法效率
* 不需要真的把6位数都循环一遍,因为回文数是对称的
* 只需要求一半。5位数应该也能用这想法,但是写6位数
* 时才想起来,就懒得改5位数的了。。。
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int a, b, c, d, e;
//求5位数
for (int i = 10000; i < 100000; i++) {
a = i / 10000;// 最高位
b = (i / 10) % 10;
c = (i / 100) % 10;// 中间位
d = i % 10;// 个位
e = (i / 1000) % 10;// 次高位
if (a == d && b == e && a + b + c + d + e == n) {
System.out.print(a + "" + e + "" + c + "" + b + "" + d + "\n");
}
}
//求6位数采用减治法思想
for (int i = 100; i < 1000; i++) {
a = i / 100;// 最高位
b = (i / 10) % 10;
c = i % 10;// 个位
if ((a + b + c) * 2 == n) {
System.out.print(a + "" + b + "" + c + "" + c + "" + b + "" + a + "\n");
}
}
}
}