这个是蓝桥杯很早的题目啦,建议大家可以去蓝桥杯历届试题-回文数字 - C语言网 (dotcpp.com)
中可以看到原题.
题目描述
观察数字: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
这些呢,就是该题目的叙述,其实这道题并不难,可以从不同的角度来解决.作者是这样做的:
由于是求解5位或6位的回文数字,作者没有把他看成一个十进制的数字,而是把题目中的回文数看做放置在大小为5和6的整形数组中
要使得回文,必须索引为0和4的位置都为A(A的取值范围为1-9,因为是十进制整数,首位不能为0),索引1和3都为B(B的取值范围为0-9),索引为2的位置为C(C的范围为0-9),数学的角度看五位数中共有9*10*10种回文数,但题目还要求A + B + C + B + A = N (输入的值),由此我们可以暴力求解
for(i=1; i<=9; i++) {
num[0] = num[4] =i; //此处将首位和末位赋值为同一个数,从小到大赋值,保证了十进制数的从小到大输出
for(j=0; j<=9; j++) {
num[1] = num[3] =j; //跟上边同理
for(k=0; k<=9; k++) {
num[2] = k; //也是从小到大赋值
if(num[0]+num[1]+num[2]+num[3]+num[4]==n) { //要满足条件才可以输出
printf("%d%d%d%d%d\n",num[0],num[1],num[2],num[3],num[4]);
//cout<<num[0]<<num[1]<<num[2]<<num[3]<<num[4]<<endl;
}
}
}
}
六位数同理:
for(i=1; i<=9; i++) {
num[0] = num[5] =i;
for(j=0; j<=9; j++) {
num[1] = num[4] =j;
for(k=0; k<=9; k++) {
num[2] = num[3]= k; //与五位数不同的是中间的两位需要赋值相同
if(num[0]+num[1]+num[2]+num[3]+num[4]+num[5]==n) {
printf("%d%d%d%d%d%d\n",num[0],num[1],num[2],num[3],num[4],num[5]);
//cout<<num[0]<<num[1] <<num[2]<<num[3]<<num[4]<<num[5]<<endl;
}
}
}
}
总的代码就是这个:
#include<iostream> // 题目 1434: 蓝桥杯历届试题-回文数字
using namespace std;
int main() {
int n;
bool flag=false; //判断是不是至少有一个回文数,
cin>>n;
int num[6];
int i,j,k;
for(i=1; i<=9; i++) {
num[0] = num[4] =i;
for(j=0; j<=9; j++) {
num[1] = num[3] =j;
for(k=0; k<=9; k++) {
num[2] = k;
if(num[0]+num[1]+num[2]+num[3]+num[4]==n) {
flag = true;
printf("%d%d%d%d%d\n",num[0],num[1],num[2],num[3],num[4]);
}
}
}
}
for(i=1; i<=9; i++) {
num[0] = num[5] =i;
for(j=0; j<=9; j++) {
num[1] = num[4] =j;
for(k=0; k<=9; k++) {
num[2] = num[3]= k;
if(num[0]+num[1]+num[2]+num[3]+num[4]+num[5]==n) {
flag = true;
printf("%d%d%d%d%d%d\n",num[0],num[1],num[2],num[3],num[4],num[5]);
}
}
}
}
if(!flag)
{
cout<<"-1";
}
return 0;
}
PS:如果你仔细观察,会发现,五位数中最大的回文数为99999,它各位的数字之和为5*9=45,所以当输入大于45的数字时,输出中便没有五位的回文数啦;
同理,6位数字中的最大的回文数是999999,它的各位数字之和为6*9=54,所以当输入的数字大于54时,结果只会输出-1;我们也可借此对循环进行改进.
作者是第一次在csdn上发文,有什么错误希望大家多多指正啦!