鱼C论坛

 找回密码
 立即注册
查看: 1701|回复: 2

[已解决]找出10000以内的**完美数**

[复制链接]
发表于 2020-5-4 21:16:22 | 显示全部楼层    本楼为最佳答案   
本帖最后由 txxcat 于 2020-5-4 21:38 编辑

首先在不看答案的情况下写了一段代码:
  1. '''Perfect number'''
  2. for i in range(1,10000):
  3.     a=0
  4.     for j in range(1,i//2+1):
  5.         if i%j==0:
  6.             a+=j
  7.     if i==a:
  8.         print(i)
复制代码

运行起来没问题,再和答案的代码进行了对比,发现虽然我写的简单,但是效率不高,因为除数的范围到了被除数的一半,越往后,运算量越大。
答案的代码就减少了不少,除数范围只有平方根以下的数,减少了不少运算量,为什么这么算,以28为例子来说明:
28的因子有:1、2、4、7、14,除了1可以分为2*14、4*7,可见其实因子数除了1以外都是成对出现的,相乘等于被除数本身,所以找到分界点就行了,然后除以算出来的因子得到对应的另一个因子数。分界点就是平方根,这点好理解吧。后面得到对应因子的判断中,排除1的原因已经直到了,但是为什么num // factor != factor?这是防止平方根正好也是因子的情况,不排除掉就会重复多算了一个因子。
根据这个算法优化了一下代码,
  1. for num in range(2, 10000):         #从2开始算可以避开这个算法的一个小bug
  2.     result = 1                                           #1是所有整数的因子,所以1就不进入循环直接带入可以少算一轮
  3.     for factor in range(2, int(num**0.5) + 1):           #从2开始循环,原代码的1的判断可以去掉了
  4.         if num % factor == 0:
  5.             result += (factor+(num / factor if factor**2!=num else 0 ))     #直接把成对因子加入,平方根是因子就只算1个。
  6.     if result == num:
  7.         print(num)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-10 03:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表