https://www.toutiao.com/a6644376171280597517/

编程求10000以内的完全数。

啊完全数,我感觉我与欧拉,梅森等数学大师又近了一步。

解题思路:

思考五分钟后完全没有思路,怎么确定一个数的所有真因子呢?百度一下看看是不是有什么模块有类似的函数吧....

没找到模块,不过找到了三行代码

shu=10000
result=[a for a in range(1,shu+1) if shu%a==0]
print(result)

(要不说Python牛逼,用c的话没有现成函数怎么也得几十行吧。)

好那现在可以尝试编写代码了

list_num = []
for i in range(1,10000):if sum([ a for a in range(1,i) if i % a == 0]) == i:list_num.append(i)
print(list_num)

五行代码....py天下第一!!!py天下第一!!!py天下第一!!!

#!/usr/bin/env python
def isPerfectNumber(n):a = 1b = ns = 0while a < b:if n % a == 0:s += a + ba += 1b = n / aif a == b and a * b == n:s += areturn s - n == n
for k in range(2, 10000):if isPerfectNumber(k):print k

思路相似,但用列表推导更简单

第四题:相亲数

220的真因数之和为1+2+4+5+10+11+20+22+44+55+110=284

284的真因数之和为1+2+4+71+142=220

毕达哥拉斯把这样的数对A、B称为相亲数:A的真因数之和为B,而B的真因数之和为A。

求100000以内的相亲数。

解题思路:

构建列表,遍历列表,求x的真因数并求和记作a,然后对a求真因数之和b,判断x?=b。

尝试解题:

list_num = []
for i in range(2,10000):x = sum([a for a in range(1,i) if i % a == 0])y = sum([b for b in range(1,x) if x % b == 0])if i == y:list_num.append((i,x))
print(list_num)
#运行结果:[(6, 6), (28, 28), (220, 284), (284, 220), (496, 496), (1184, 1210), (1210, 1184), (2620, 2924), (2924, 2620), (5020, 5564), (5564, 5020), (6232, 6368), (6368, 6232), (8128, 8128)]

可以看出有重复的,有完全数和本身的

可以考虑用集合,集合是无序的而且重复元素不出现

list_num = []
for i in range(2,10000):x = sum([a for a in range(1,i) if i % a == 0])y = sum([b for b in range(1,x) if x % b == 0])if i == y and x != y and (i,x) :m = {i,x}list_num.append(m)
print(list_num)
#[{220, 284}, {220, 284}, {1184, 1210}, {1184, 1210}, {2924, 2620}, {2924, 2620}, {5564, 5020}, {5020, 5564}, {6232, 6368}, {6368, 6232}]
[Finished in 7.7s]

列表还是有重复,等回头再学习一下再修改

第五题:黑洞数

黑洞数又称陷阱数,是类具有奇特转换特性的整数。任何一个数字不全相同的整数,经限“重排求差”操作,总会得到某一个或一些数,这些数即为黑洞数。“重排求差”操作即把组成该数的数字重排后得到的最大数减去重排后得到的最小数。

举个例子,3位数的黑洞数为495.

简易推导过程:随便找个数,如297,3个位上的数从小到大和从大到小各排一次,为972和279,相减得693。按上面做法再做一次,得到594,再做一次,得到495,之后反复都得到495。

验证4位数的黑洞数为6174。

解题思路:

对所有四位数进行如下操作:将数字分解存入列表,列表排序,组合成数字,然后大小相减,对比6174相等则验证成功

列表排序相关函数:

#将列表中元素反转排序
>>> x = [1,5,2,3,4]
>>> x.reverse()
>>> x
[4, 3, 2, 5, 1]
#此函数方法对列表内容进行正向排序,排序后的新列表会覆盖原列表(id不变),也就是sort排序方法是直接修改原列表list排序方法。
>>> a = [5,7,6,3,4,1,2]
>>> a.sort()
>>> a
[1, 2, 3, 4, 5, 6, 7]
#即可以保留原列表,又能得到已经排序好的列表sorted()操作方法如下:
>>> a = [5,7,6,3,4,1,2]
>>> b = sorted(a)
>>> a
[5, 7, 6, 3, 4, 1, 2]
>>> b
[1, 2, 3, 4, 5, 6, 7]

本来根据我的思路大致写了一下代码如下

def number_x(num,other):list_num = []while num > 0:a = num % 10num = int( num / 10 )list_num.append(a) if other == 'min':list_min = sorted(list_num)num_min = list_min[0] + list_min[1] * 10 + list_min[2] * 100 + list_min[3] * 1000return num_minelif other == 'max':list_min = sorted(list_num)list_max = sorted(list_min)num_max = list_max[0] + list_max[1] * 10 + list_max[2] * 100 + list_max[3] * 1000return num_max
for i in range(1000,10000):x = ia = 0while x != 6174:x_min = number_x(x,'min')x_max = number_x(x,'max')x = x_max - x_mina += 1if a == 1000:print('fail',i)breakprint('success')

运行出错先不说,发现自己思路很死,想到一个用while取各位的数字存到列表就用到死,重排列数字之后组合成一个数字的时候用的竟然只想到了最蠢的方法,简直愚蠢之极。

然后报错问题,报错是列表超出范围了,重新走一下流程之后发现第一个数1000重组之后的数字是1000和1,1只有1位数可不超范围了,再相减之后成了999,变成一个三位数了???成了求三位数的黑洞数了?而且999三个数字完全相同没有黑洞数。只能说明题意有问题。百度一下发现应该是相减之后不足四位前面应该添零,大致意思是这样

1000-0001 = 0999

9990-0999 = 8991

9981-1899 = 8082

8820-0288 = 8532

8532-2358 = 6174

问题变得复杂了好多,得考虑0的问题。作为练习的前几个题不应该这么麻烦才是,先看看官方给出的解题思路。

def fun(n):a = [int(c) for c in str(n)]a.sort()s1 = reduce(lambda x, y: 10 * x + y, a[::-1])s2 = reduce(lambda x, y: 10 * x + y, a)return n if s1 - s2 == n else fun(s1 - s2)
res = fun(6294)
print 'res : ', res
#这是python2.x版本的代码
#查了一下3.x好像是reduce()从全局函数移除了,添加到了fucntools模块里引用要用
from functools import reduce

好吧,老师解题也不走心,完全没考虑我这么多,,,

题意是要验证四位数的黑洞数,这个只能验证一个数不说还没考虑0的情况。

不过老师用的方法就比我好多了,这就参考老师的代码修改一下我的程序吧

突然灵光一闪,将整数操作变为字符串操作,需要相减时再int,相减之后再与6174比较,如果不同再返回字符串,如果返回的字符串长度不到4在用字符串'0'+'返回的字符串',这样循环操作不就比直接操作整数型数字简单了么。

from functools import reduce
def fun(str_n):x = ['1111','2222','3333','4444','5555','6666','7777','8888','9999']if str_n in x:return str_nelif str_n == '6174':return 'succes'else:a = [int(c) for c in str_n]a.sort()s1 = reduce(lambda x, y: 10 * x + y, a[::-1])s2 = reduce(lambda x, y: 10 * x + y, a)m = s1 - s2 s = '0' * (4 - len(str(m))) + str(m)fun(s)
list_fail = []
for i in range(1000,10000):if fun(str(i)) == 'succes':passelse:list_fail.append(i)
print (list_fail)

拒绝枯燥,趣味学python!python基础练习:趣味百题!相关推荐

  1. python网课答案查询_中国大学慕课Python编程基础期末考试查题公众号答案

    -How are you feeling now, Miss?-To tell the truth, much_______.A.badB.badlyC.worseD.worst He says he ...

  2. 使用python开发网页游戏_四大游戏编程网站,边玩游戏,边学Python,拒绝枯燥快乐编程...

    原标题:四大游戏编程网站,边玩游戏,边学Python,拒绝枯燥快乐编程 前言 学习编程虽然对有些人来说是件乐事,但是对大多数人来说仍然是一件比较枯燥困难的事情.当然,面临这样困惑的人,并不是只有你一个 ...

  3. 小白新人Python哪些基础知识必学?

    点击"程序IT圈"关注我一起学习成长 很多想入门的小伙伴还不知道Python应该怎么学,哪些知识必学,今天我们就来盘点一下. 01 入门方法推荐 总体来讲,找一本靠谱的书,由浅入深 ...

  4. 学了Python基础,苦于无法上手实战,看这本

    Python语言能让编程变得更加简单易学.但是,在掌握Python基础知识后,你是否面临编程技能无法提升,不知后续学习该如何开展的问题?<Python编程实战 妙趣横生的项目之旅>包含许多 ...

  5. 21天学通Python,从入门到上手,学习方式+学习资料+学习视频汇总,零基础转行自学必备

    前言 python的学习资料小编看过很多,但是这个21天学通python真的是堪称极品!作者团队成员为一线开发工程师.资深编程专家或专业培训师,在编程开发方面有着丰富的经验,颇受广大读者认可.长期积累 ...

  6. 请问大家如何看待Python?零基础如何学Python?

    给大家整理的这套python学习路线图,按照此教程来一步步的学习,肯定会对python有更深刻的认识.或许可以喜欢上python这个易学,精简,开源的语言.此套教程,不但有视频教程,还有源码分享,让大 ...

  7. python零基础看什么视频和书籍-资料│最适合大学生零基础学的Python视频+电子书...

    原标题:资料│最适合大学生零基础学的Python视频+电子书 月最热资源下载 (▲点击阅读) 已经不少童鞋跟播妞咨询了python的资源 今天播妞将整理好的部分python资源发布 是最适合零基础大学 ...

  8. python基础知识整理-整理了27个新手必学的Python基础知识点

    原标题:整理了27个新手必学的Python基础知识点 1.执行脚本的两种方式 Python a.py 直接调用Python解释器执行文件 chomd +x a.py ./a.py #修改a.py文件的 ...

  9. python零基础能学吗 知乎-如何零基础入门 Python?

    从17年6月入门Python到今天有大半年了,总结一下这半年来自学Python的路径. 本人只在两年前接触过HTML和CSS,但严格来说这两门只能算是标记语言而非编程语言,而且开始学Python的时候 ...

  10. python语言编程基础-Python语言入门详解!快速学成Python!

    原标题:Python语言入门详解!快速学成Python! 很多技能是被职场所需要的,但很可惜... 这些技能在大学中并学习不到. 大学和职场现实存在的横沟对大部分同学来说难以跨越或碰得头破血流... ...

最新文章

  1. 【Qt】QObject::moveToThread 总结
  2. Web前端开发必备:《Jquery实战》第3版 介绍
  3. 干货分享:什么是Java设计工厂模式?
  4. android beta项目官方页面,安卓7.0开发者预览版如何安装?Android Beta项目正式上线...
  5. java中1和1.0_在Java中如何以0.1f增量在0.1f和1.0f之间进行迭代?
  6. 数据库面试 - 如何设计可以动态扩容缩容的分库分表方案?
  7. spring编程式事务
  8. 常用的 Windows 键
  9. 扩展 TextBox 控件 - 依 FormViewMode 来自行设定状态
  10. 为什么要使用boost::enable_shared_from_thisT
  11. 微信公号开发之自定义菜单攻略
  12. 联想微型计算机u盘启动,联想ThinkCentre一体机如何设置U盘启动_联想ThinkCentre电脑怎样从USB启动...
  13. Prometheus 实战于源码分析之webHandler
  14. 2021年小米校招java编程题
  15. iis 6.0部署asp网站
  16. Windows批处理脚本(BAT,CMD)简明教程
  17. 甲骨文战略收购一览表
  18. 计算机保密检查工具 百度云,计算机系统保密检查工具
  19. c语言编程输出指定范围的素数,C语言输出范围内所有素数
  20. Windows 安装 Brave Browser

热门文章

  1. 视觉Transformer快速入门指南!
  2. 【深度】清华黄高等人新作:动态神经网络首篇综述
  3. 2019北京智源大会全部议题完整公开
  4. 都说过了,它跟蛇没关系
  5. TensorFlow数据归一化
  6. OpenCV,马赛克 常用图像增强算法的实现
  7. 独家 | 5个机器学习开源项目来挑战你的数据科学技能!(附链接)
  8. 必备 | 人工智能和数据科学的七大 Python 库
  9. 总结Anaconda+Tensorflow遇到的坑
  10. 哈佛、MIT学者联手,创下矩阵乘法运算最快纪录