回文数字问题
问题描述
观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。
本题要求你找到一些5位的十进制数字。满足如下要求:
该数字的各个数位之和等于输入的整数。将这些数按从小到大排序后输出,一行一个
本题要求你找到一些5位的十进制数字。满足如下要求:
该数字的各个数位之和等于输入的整数。将这些数按从小到大排序后输出,一行一个
输入格式
一个正整数 n (10<n<100), 表示要求满足的位数和。
输出格式
若干行,每行包含一个满足要求的5位数。
数字按从小到大的顺序排列。
如果没有满足条件的,输出:-1
数字按从小到大的顺序排列。
如果没有满足条件的,输出:-1
样例输入
44
样例输出
99899
样例输入
55
样例输出
-1
问题解析
关键在于将5位回文数字拆开,判断5位回文数字之和是否等于输入数字 n:若等于,则输出该回文数字。迭代所有5位回文数字,最后判断是否存在符合要求的回文数字,若不存在,输出-1。
如:输入n(10<n<100),5位回文数字为ABCBA(9999<ABCBA<100000),即判断(A+B)*2+C == n还是 (A+B)*2+C != n
代码答案
JAVA代码
import java.util.Scanner;
public class Hello {
// @param args
public static void main(String[] args)
{
// 1. 输入n
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int num = 0;
// 2. 限制在5位数
for (int i = 10000; i < 100000; i++) {
// 3. 判断是不是回文
if (is_huiwen(i)) {
// 4. 判断是否符合要求
if (f(i) == n) {
// 5. 正常输出
System.out.println(i);
num++;
}
}
}
// 6. 判断是否存在符合要求的数字
if(num==0){
System.out.println(-1);
}
}
private static int f(int b) {
int sum = 0;
int t;
int m = b;
// 计算前两位数的和 = 后两位数的和
for (int i = 0; i < 2; i++) {
t = m % 10;
sum += t;
m /= 10;
}
sum *= 2;
sum += (m % 10);
return sum;
}
private static boolean is_huiwen(int b) {
String s = String.valueOf(b); //数字转换为字符串
char[] c = s.toCharArray(); //字符串转换为字符数组
for (int i = 0, j = s.length() - 1; i < s.length(); i++, j--) {
if (i == j || j < i)
break;
if (c[i] != c[j])
return false;
}
return true;
}
}
Python代码
n = int(input())
ls = []
ls2 = []
for i in range(9):
i +=1
bit_5 = i
for j in range(10):
bit_4 = j
for k in range(10):
if n == i+j+k+bit_4 + bit_5:
str_huiwen = str(i)+str(j)+str(k)+str(bit_4)+str(bit_5)
ls.append(str_huiwen)
if ls == []:
print(-1)
else:
for m in range(len(ls)):
ls2.append(int(ls[m]))
for z in range(len(ls2)):
print(ls2[z])
print('\n')