首页 / PYTHON / 蓝桥杯,特殊回文数,Python
蓝桥杯,特殊回文数,Python
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了蓝桥杯,特殊回文数,Python,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1859字,纯文字阅读大概需要3分钟。
内容图文
![蓝桥杯,特殊回文数,Python](/upload/InfoBanner/zyjiaocheng/643/accf0d13fdb740ec88b620608649d6c9.jpg)
题目
问题描述 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 in num) 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 in num): 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 in sorted(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 in sorted(map(int, x)): print(j)
我们观察两处代码的差异,其实只在对列表排序的时候将元素转成整型而已,至于为什么会得到不同的结果我想不清楚,如果有知道原因的读者烦请私聊我或者在下面留言。
内容总结
以上是互联网集市为您收集整理的蓝桥杯,特殊回文数,Python全部内容,希望文章能够帮你解决蓝桥杯,特殊回文数,Python所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。