Python 查找第一个除数超过500的三角形数的代码将无法完成运行
好的,我正在研究(找到第一个因数超过500的三角形数),我的代码(在Python 3中)如下所示:Python 查找第一个除数超过500的三角形数的代码将无法完成运行,python,python-3.x,math,Python,Python 3.x,Math,好的,我正在研究(找到第一个因数超过500的三角形数),我的代码(在Python 3中)如下所示: factors = 0 y=1 def factornum(n): x = 1 f = [] while x <= n: if n%x == 0: f.append(x) x+=1 return len(f) def triangle(n): t = sum(list(range(1,n)))
factors = 0
y=1
def factornum(n):
x = 1
f = []
while x <= n:
if n%x == 0:
f.append(x)
x+=1
return len(f)
def triangle(n):
t = sum(list(range(1,n)))
return t
while factors<=500:
factors = factornum(triangle(y))
y+=1
print(y-1)
因子=0
y=1
def factornum(n):
x=1
f=[]
虽然x据我所知,您的代码可以工作,但计算因子的数量需要很长时间。对于150个因子,运行大约需要20秒,随着因子数量越来越多,时间将急剧增长
减少处理时间的一种方法是减少正在执行的计算数量。如果你分析你的代码,你每次都在计算n%1
,这是一个不必要的计算,因为你知道每个整数都可以被它自己和一整除。有没有其他方法可以减少计算量?也许要记住,如果一个数字可以被20整除,那么它也可以被2、4、5和10整除
我可以说得更具体一些,但您需要一个指向正确方向的指针。据我所知,您的代码可以正常工作,但计算因子的数量需要很长时间。对于150个因子,运行大约需要20秒,随着因子数量越来越多,时间将急剧增长
减少处理时间的一种方法是减少正在执行的计算数量。如果你分析你的代码,你每次都在计算n%1
,这是一个不必要的计算,因为你知道每个整数都可以被它自己和一整除。有没有其他方法可以减少计算量?也许要记住,如果一个数字可以被20整除,那么它也可以被2、4、5和10整除
我可以说得更具体一些,但是你想要一个指向正确方向的指针。你的算法效率很低
如果您要求的是指针,而不是完整的解决方案,那么主要的指针是:
有一种更有效的方法来计算next。wiki中有一个明确的公式。此外,如果您生成所有数字的序列,则将下一个n
添加到上一个数字会更加有效。(Sidenotelist
在sum(list(range(1,n)))
对我来说毫无意义。如果你想使用这种方法,sum(xrange(1,n)
可能会更有效,因为它不需要范围的具体化)
有很多更有效的方法来解决这个问题
有一种更有效的方法来计算因子的数量。它实际上是在Euler之后调用的:参见
一般来说,Euler项目问题(就像许多其他编程竞赛一样)不应该完全靠蛮力来解决。你应该先想出一些公式和/或更有效的算法。你的算法效率很低
如果您要求的是指针,而不是完整的解决方案,那么主要的指针是:
有一种更有效的方法来计算next。wiki中有一个明确的公式。此外,如果您生成所有数字的序列,则将nextn
添加到上一个数字上会更有效。(Sidenotelist
中的sum(list(range(1,n)))
对我来说毫无意义。如果你想使用这种方法,sum(xrange(1,n)
可能会更有效,因为它不需要范围的具体化)
有很多更有效的方法来解决这个问题
有一种更有效的方法来计算因子的数量。它实际上是在Euler之后调用的:参见
一般来说,Euler项目问题(与许多其他编程竞赛一样)你应该先想出一些公式和/或更有效的算法。从代码的外观来看,这并不是最好的方法。例如,一种简单的优化方法是一直到数字的一半。另外,试着想想如何使用素数fa来实现这一点CTOR,这可能是另一种解决方案。祝你好运!从外观上看,代码运行良好,但这不是最好的方法。例如,一种简单的优化方法是一直优化到数字的一半。此外,试着想想如何使用素数实现这一点,这可能是另一种解决方案。祝你好运!首先,你必须定义一个因子函数:
from functools import reduce
def factors(n):
step = 2 if n % 2 else 1
return set(reduce(list.__add__,
([i, n//i] for i in range(1, int(pow(n,0.5) + 1)) if n % i
== 0)))
这将创建一个集合,并将数字n的所有因子放入其中
第二,使用while循环,直到获得500个因子:
a = 1
x = 1
while len(factors(a)) < 501:
x += 1
a += x
a=1
x=1
而len(因子(a))<501:
x+=1
a+=x
该循环将在len(系数(a))=500时停止。
简单打印(a),您将得到答案。首先您必须定义一个因子函数:
from functools import reduce
def factors(n):
step = 2 if n % 2 else 1
return set(reduce(list.__add__,
([i, n//i] for i in range(1, int(pow(n,0.5) + 1)) if n % i
== 0)))
这将创建一个集合,并将数字n的所有因子放入其中
第二,使用while循环,直到获得500个因子:
a = 1
x = 1
while len(factors(a)) < 501:
x += 1
a += x
a=1
x=1
而len(因子(a))<501:
x+=1
a+=x
该循环将在len(系数(a))=500时停止。
简单的打印(a),你就会得到你的答案。试着在你的while循环中打印y和因子。有一种更好的方法写sum(list(range(1,n)))
…(n**2+n)/2
试着在while循环中打印y和因子。有一种更好的方法写sum(list(range(1,n))
…。(n**2+n)/2