簡體   English   中英

查找第一個三角形數大於500的因子的代碼將無法完成運行

[英]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問題的原因是為了改進編碼。 謝謝!

您的算法效率很低。

如果您要求提供指針而非完整解決方案,則主要指針為:

  1. 有一種更有效的方法來計算下一個三角數 Wiki中有一個明確的公式。 同樣,如果您生成所有數字的序列,則將下一個n添加到前一個數字會更有效。 sum(list(range(1,n)))旁注list對我來說根本沒有意義。)如果您仍要使用此方法, sum(xrange(1,n)可能會更有效不需要實現范圍)

  2. 有很多更有效的因式分解因子

  3. 有一種更有效的方法來計算因子數量。 它實際上是在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM