蓝桥杯历届试题-回文数字

这个是蓝桥杯很早的题目啦,建议大家可以去蓝桥杯历届试题-回文数字 - 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上发文,有什么错误希望大家多多指正啦!

  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值