Python - 将数字的因子按排序顺序放入数组

标签 python algorithm sorting factors

我已经编写了这个算法来找到给定数字的所有因子并将它们放入列表中:

def find_all_factors(n):
    factors = []
    for i in range(1, floor(sqrt(n))+1):
        if n % i == 0:
            factors.append(i)
            cofactor = n // i
            if i != cofactor: factors.append(cofactor)
    return factors

在列表中,辅因子将彼此相邻放置,但我希望它们按排序顺序出现。上述算法的输出示例:对于 n = 36,它输出 [1, 36, 2, 18, 3, 12, 4, 9, 6]。我这样做是为了练习,我想知道让它们按排序顺序排列的最有效方法是什么,有什么想法吗?

您可以在下面看到我的解决方案之一。它有效,但我不认为它是最佳的。

def find_all_factors(n):
    lower_factors = []
    higher_factors = []
    for i in range(1, floor(sqrt(n))+1):
        if n % i == 0:
            lower_factors.append(i)
            cofactor = n // i
            if i != cofactor: higher_factors.append(cofactor)
    return lower_factors + [higher_factors[-i] for i in range(1, len(higher_factors)+1)]  #Reverses higher_factors.

最佳答案

只需简单地返回排序后的列表:

return sorted(factors)

如果您不喜欢使用 sorted 函数,只需将循环范围更改为 (1,n+1) 即可:

def find_all_factors(n):
    factors = []
    for i in range(1, n+1):
        if n % i == 0:
            factors.append(i)
    return factors

find_all_factors(12) # [1, 2, 3, 4, 6, 12]

另一种方法是使用bisect(最有效的方法):

import bisect
def find_all_factors(n):
    factors = []
    for i in range(1, math.floor(math.sqrt(n))+1):
        if n % i == 0:
            bisect.insort(factors,i)
            cofactor = n // i
            if i != cofactor: bisect.insort(factors, cofactor)
    return factors

find_all_factors(12) # [1, 2, 3, 4, 6, 12]

在此模块中插入是 O(n) 而搜索是 O(log(n))

关于Python - 将数字的因子按排序顺序放入数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35672998/

相关文章:

python:获取导入函数的抽象语法树?

algorithm - 使用霍夫变换进行椭圆检测

php - 具有特定标准的笛卡尔积

javascript - Meteor JS - 添加新帖子时 $sort 不起作用

mysql - 如何对 ColdFusion 中循环 Mysql 查询生成的表进行排序?

java - 升序排序

python - 获取 urllib2.urlopen 的 HTTP 返回值的套接字

python - 仅具有查看权限的 Django 模型表单将所有字段排除在外

algorithm - 是否有可能在 O(n) 时间内找到差值最小的两个数

python - 如何删除 SQLAlchemy 中的外键约束?