题目描述
观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。
本题要求你找到一些5位或6位的十进制数字。满足如下要求:
该数字的各个数位之和等于输入的整数。
输入格式
一个正整数 n (10< n< 100), 表示要求满足的数位和
输出格式
若干行,每行包含一个满足要求的5位或6位整数。
数字按从小到大的顺序排列。
如果没有满足条件的,输出:-1
样例输入
44
样例输出
99899 499994 589985 598895 679976 688886 697796 769967 778877 787787 796697 859958 868868 877778 886688 895598 949949 958859 967769 976679 985589 994499
思路
只有五六位回文数,所以只取小于10的个位正整数,符合要求就把他们拼成回文数
5位数字和6位数字分开计算,将两端的数字相加后再被目标数减去,得到中间数,如果中间数是个位正整数,则符合条件,拼成回文数输出
因为按从小到大输出,回文数两端相等,且前一位大于后一位,所以组成嵌套循环
#include<stdio.h>
int number5(int n) {//5位数时的回文数
if (n > 45)//超出5位数范围
return 0;
int flag=0;
int i, j;//前两位数
int numMid = 1;//第三位数
for (i = 1;i < 10;i++) {
for (j = 0;j < 10;j++) {//二三位数可以为0
numMid = n - (i + j) * 2;
if (numMid >= 0 && numMid < 10) {//数字符合要求
printf("%d%d%d%d%d\n", i, j, numMid, j, i);
flag = 1;
}
}
}
return flag;
}
int number6(int n) {//6位数的回文数
if (n > 54 || n % 2)//超出6位数范围,奇数在6位数中无法回文
return 0;
int GoalNum = n / 2;//目标数字等于前三位乘2,所以这里只取一半目标数字就能计算
int flag = 0;
int i, j, k;
for (i = 1;i < 10;i++) {
for (j = 0;j < 10;j++) {//二三位可以为0
k = GoalNum - i - j;
if (k >= 0 && k < 10) {
printf("%d%d%d%d%d%d\n", i, j, k, k, j, i);
flag = 1;
}
}
}
return flag;
}
int main() {
int n;
scanf("%d", &n);
int flag1 = number5(n);
int flag2 = number6(n);
if (!flag1 && !flag2) {//判断数字符合要求
printf("-1\n");
}
return 0;
}