有人可以向我解释一种在 Python (2.7) 中查找数字的所有因子的有效方法吗?
我可以创建一个算法来执行此操作,但我认为它的编码很差并且需要很长时间才能生成大量结果。
from functools import reduce
def factors(n):
return set(reduce(list.__add__,
([i, n//i] for i in range(1, int(n**0.5) + 1) if n % i == 0)))
这将很快返回一个数字的所有因子n
.
为什么要以平方根为上限?
sqrt(x) * sqrt(x) = x
。因此,如果两个因子相同,则它们都是平方根。如果你使一个因素变大,你就必须使另一个因素变小。这意味着两者之一始终小于或等于sqrt(x)
,因此您只需搜索到该点即可找到两个匹配因素之一。然后你可以使用x / fac1
to get fac2
.
The reduce(list.__add__, ...)
正在列出一些小清单[fac1, fac2]
并将它们加入到一个长长的列表中。
The [i, n/i] for i in range(1, int(sqrt(n)) + 1) if n % i == 0
如果相除时有余数,则返回一对因数n
除以较小的值为零(它也不需要检查较大的值;它只需除以n
由较小的一个。)
The set(...)
外部是消除重复项,这只发生在完美的正方形上。为了n = 4
,这将返回2
两次,所以set
摆脱其中之一。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)