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)