python五位回文数_蓝桥杯,特殊回文数,Python

题目

问题描述

123321是一个非常特殊的数,它从左边读和从右边读是一样的。

输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。

输入格式

输入一行,包含一个正整数n。

输出格式

按从小到大的顺序输出满足条件的整数,每个整数占一行。

样例输入

52

样例输出

899998

989989

998899

数据规模和约定

1<=n<=54。

解法一

我们首先想到的就是遍历所有五位数和六位数,将数字转成字符串再逆转然后判断是否为回文数,接着求各位数字之和判断是否等于n,满足以上两个条件就是答案。

n = int(input(''))for i in range(10000, 1000000):

num=str(i)

s= sum(int(j) for j innum)if s == n and num == num[::-1]:print(num)

以上代码提交显示运行超时。仔细一想不难发现这里其实是二重循环,因为sum()函数求和过程其实也是一个循环,从而导致算法复杂度增大。下面我们看改进代码:

n = int(input(''))for i in range(10000, 1000000):

num=str(i)if num == num[::-1]:if n == sum(int(j) for j innum):print(num)

以上代码显示通过。因为这里的算法复杂度已经降低了很多,我们先判断是否为回文数再来求数字之和,因为满足回文数的数字并不多,因此减少了很多无效的求和运算。

解法二

我们采用逆向思维,先保证是回文数再判断数字之和是否等于n。根据回文数左右两边对称的特点,我们可以将五位数到六位数的循环转换成三位数到四位数的循环。

n = int(input(''))

x=[]for i in range(100, 1000):if sum(map(int, str(i) + (str(i)[:2])[::-1])) ==n:

x.append(str(i)+ (str(i)[:2])[::-1])if sum(map(int, str(i) + str(i)[::-1])) ==n:

x.append(str(i)+ str(i)[::-1])for j insorted(x):print(j)

以上代码得分只有四十分。我们再看下面的改进代码:

n = int(input(''))

x=[]for i in range(100, 1000):if sum(map(int, str(i) + (str(i)[:2])[::-1])) ==n:

x.append(str(i)+ (str(i)[:2])[::-1])if sum(map(int, str(i) + str(i)[::-1])) ==n:

x.append(str(i)+ str(i)[::-1])for j insorted(map(int, x)):print(j)

我们观察两处代码的差异,其实只在对列表排序的时候将元素转成整型而已,至于为什么会得到不同的结果我想不清楚,如果有知道原因的读者烦请私聊我或者在下面留言。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值