[英]python program for finding triangular number with more than 500 divisors
[英]Code finding the first triangular number with more than 500 divisors will not finish running
好的,所以我正在研究Euler問題12 (找到第一個三角形數,其因子超過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)))
return t
while factors<=500:
factors = factornum(triangle(y))
y+=1
print(y-1)
基本上,函數會遍歷輸入數字n之下的所有數字,檢查它們是否均勻地划分為n,如果是,則將它們添加到列表中,然后返回該列表中的長度。 另一個通過將列表中從1到輸入數字的所有數字相加並返回總和來生成三角數。 然后while循環繼續生成使用迭代變量的三角形數y
作為輸入的triangle
函數,然后運行factornum
該函數,並將結果在factors
變量。 循環繼續運行,並且y
變量繼續增加,直到因子數量超過500。然后打印結果。
但是,當我運行它時,什么也沒發生-沒有錯誤,沒有輸出,它一直在運行。 現在,我知道我的代碼不是最有效的,但是我讓它運行了相當長的時間,但仍然沒有產生結果,所以在我看來,某處有一個錯誤。 我已經看過它了,似乎找不到錯誤。
我只是要求不要給出完整的解決方案或經過徹底改進的解決方案,而要指出我的錯誤或需要改進的地方,因為我做Euler問題的原因是為了改進編碼。 謝謝!
您的算法效率很低。
如果您要求提供指針而非完整解決方案,則主要指針為:
有一種更有效的方法來計算下一個三角數 。 Wiki中有一個明確的公式。 同樣,如果您生成所有數字的序列,則將下一個n
添加到前一個數字會更有效。 ( sum(list(range(1,n)))
旁注list
對我來說根本沒有意義。)如果您仍要使用此方法, sum(xrange(1,n)
可能會更有效不需要實現范圍)
有很多更有效的因式分解因子
有一種更有效的方法來計算因子數量。 它實際上是在Euler之后調用的:請參見Euler的totient函數
通常,不應以純粹的蠻力解決Euler項目問題(就像在許多其他編程競賽中一樣)。 您應該首先提出一些公式和/或更有效的算法。
據我所知,您的代碼可以工作,但是計算因子數量將花費很長時間。 對於150個因數,運行大約需要20秒,隨着您尋找越來越多的因數,該時間將急劇增加。
減少處理時間的一種方法是減少執行的計算數量。 如果您分析代碼,則每次都會計算n%1
,這是不必要的計算,因為您知道每個整數都可以被一個整數和一個整數整除。 還有其他方法可以減少計算量嗎? 也許記住,如果一個數字可以被20整除,那么它也可以被2、4、5和10整除?
我可以更具體一些,但是您想要一個正確方向的指針。
從外觀上看,代碼可以正常工作,但這並不是最佳方法。 例如,一種簡單的優化方法就是將數量減少一半。 另外,嘗試考慮如何使用主要因素來完成此操作,這可能是另一種解決方案。 祝你好運!
首先,您必須定義一個因子函數:
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
該循環將在len(factors(a))= 500處停止。簡單打印(a),您將得到答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.