当前位置: 首页 > 面试题库 >

在Python中查找数字的所有因子的最有效方法是什么?

东门彬
2023-03-14
问题内容

有人可以向我解释一种有效的方法来找到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获取fac2

reduce(list.__add__, ...)走的小名单[fac1, fac2],并在一个长长的清单一起加入他们。

[i, n/i] for i in range(1, int(sqrt(n)) + 1) if n % i == 0返回两个因素,如果当你除以其余n由较小的一个是零(它并不需要检查较大的一个过;它只是获取除以n由较小的一个。)

set(...)在外面摆脱重复,这仅发生于完美的正方形。对于n = 4,它将返回2两次,因此set摆脱其中之一。



 类似资料:
  • 问题内容: 我有一个可能的子字符串的列表,例如。实际上,该列表包含数百个条目。 我正在处理一个字符串,我正在寻找的是找到这些子字符串中任何一个的第一次出现的索引。 澄清一下,结果是3,结果是4。 我还需要知道找到了哪个子字符串(例如,其在子字符串列表中的索引或文本本身),或者至少是匹配的子字符串的长度。 有很明显的暴力方式可以实现这一目标,我想知道是否有任何优雅的Python / regex解决方

  • 我找不到任何关于数学交换和堆栈溢出的问题来回答这个特定问题。这是我发现的最相似的问题,但这个问题构造得太差,答案完全不充分。 我尝试过在谷歌上寻找无济于事。我确实发现了这一点,但这个公式似乎效率低下,因此不够。例如,如果我们取数字21... 现在想象一下找到远大于21的数字的共同因素,例如2,252和4,082...上述方法没有任何效率。 我想做的是找出最有效的方法来找到任何两个数字的所有公因数。

  • 问题内容: 我听说过使用以下方法的建议: 从下面的评论中复制:“我正在寻找这样的语句:在MySQL和PostgreSQL中,对于短查询,count()更快,对于长查询,exist(()更快,并且在可能的情况下使用QuerySet [0]将需要第一个元素,并且您要检查它是否存在。但是,当count()更快时,它仅略微更快,因此建议在两者之间进行选择时始终使用exist()。” 问题答案: exist

  • 问题内容: 我有一个非常大的NumPy数组 我想检查数组的第一列中是否存在一个值。我有很多本地方法(例如遍历每一行并进行检查),但是鉴于数组的大小,我想找到最有效的方法。 谢谢! 问题答案: 怎么样 编辑:我认为以与@detly版本相同的方式实现

  • 问题内容: -我只是解析了一个大文件,然后创建了一个包含42.000个字符串/单词的列表。我想查询[针对此列表]以检查给定的单词/字符串是否属于它。所以我的问题是: 进行查找的最有效方法是什么? 第一种方法是对列表()进行排序,然后使用 这确实是微不足道的,我相信有更好的方法可以做到。我的目标是应用快速查找来查找给定字符串是否在此列表中。如果您对其他数据结构有任何想法,欢迎使用。但是,我现在想避免

  • 问题内容: 我有一个简单的任务需要在Python中执行,该任务是将字符串转换为所有小写字母,并去除所有非ASCII非字母字符。 例如: 我有一个简单的功能可以做到这一点: 但是我不禁想到有一种更有效或更优雅的方法。 谢谢! 编辑: 感谢所有回答。我学会了,并且在某些情况下重新学习了很多python。 问题答案: 另一个解决方案(不是pythonic,但速度非常快)是使用string.transla