Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python—将数字的因子按排序顺序放入数组中_Python_Algorithm_Sorting_Factors - Fatal编程技术网

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

Python—将数字的因子按排序顺序放入数组中,python,algorithm,sorting,factors,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(cof

我编写了一个算法,可以找到给定数字的所有因子,并将它们放入一个列表中:

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)
然而,如果您不喜欢使用排序功能,只需将循环范围更改为(1,n+1):

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


此模块中的插入是
O(n)
,但搜索是
O(log(n))
只需返回已排序的列表即可:

return sorted(factors)
然而,如果您不喜欢使用排序功能,只需将循环范围更改为(1,n+1):

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


在此模块中插入的是
O(n)
,而搜索是
O(log(n))
您缺少的一件事是对列表进行更简单、更容易的操作。有一个Python内置用于反转序列:

因此,您可以:

return lower_factors + list(reversed(higher_factors))

您缺少的一件事是对列表进行更简单、更容易的操作。有一个Python内置用于反转序列:

因此,您可以:

return lower_factors + list(reversed(higher_factors))
输出:
[1,2,3,4,6,9,12,18,36]


输出:
[1,2,3,4,6,9,12,18,36]

由于这是一个练习,我希望将排序作为算法的一部分,而不是依赖于运行单独的排序算法。我要求以最有效的方式获得排序后的因子,并添加一个O(nlog(n))最后的排序算法肯定不是最有效的方法。我认为它接近最优(O sqrt(n)复杂度)使用基本的python工具。由于这是一个练习,我希望将排序作为算法的一部分,而不是依赖于运行单独的排序算法。我要求以最有效的方式获得按排序的因子,并添加一个O(nlog(n))最后的排序算法肯定不是最有效的方法。我认为,使用基本的python工具,排序算法接近最优(O sqrt(n)复杂度)。这将导致运行时错误,因为您试图用迭代器连接列表。您必须将迭代器转换为列表,如:list(reversed(higher_factors))。这将导致运行时错误,因为您试图将列表与迭代器连接起来。您必须将迭代器转换为列表,如:list(reversed(higher_factors))。
from math import floor, sqrt


def find_all_factors(n):
    factors = []
    for i in xrange(1, int(floor(sqrt(n)))+1):
        quotient, remainder = divmod(n, i)
        if remainder == 0:
            factors.append(i)
            if quotient not in factors:
                factors.append(quotient)
    return sorted(factors)

print find_all_factors(36)