2015-05-03 39 views
1
def num_of_divisors(x): 
    k=0 
    b=x 

    while x%2==0: 
     x=x//2 
     k=k+1 
    z=1 
    while x!=1: 
     for y in range(3,b,2): 
      a=0 
      while x%y==0: 
       x=x//y 
       a=a+1 
      z=z*(a+1) 
    return(z*(k+1)) 

def triangular(n): 
    return(n*(n+1)//2) 

for n in range(1,10000): 
    jk=triangular(n) 
    if num_of_divisors(jk)>500: 
     print(triangular(n)) 
     break 

問題是:通過將自然數生成項目euler 12 python代碼不運行,它是慢或什麼?

三角形號的序列。因此,第7個三角形數將是1 + 2 + 3 + 4 + 5 + 6 + 7 = 28。前十項將是:

1,3,6,10,15,21,28,36, 45,55,...

讓我們列出前七個三角數的因素:

1:1

3:1,3

6:1,2,3 ,6

10:1,2,5,10

15:1,3,5,15

21:1,3,7,21

28:1,2,4,7,14,28

我們可以看到, 28是第一個有超過五個因子的三角形數字。

第一個三角形數值超過500個除數是多少?

問題是要找到超過500個因子的第一個三角形數字。

我分別檢查了num_of_divisors()函數,它工作正常。我也檢查了num_of_divisors(76576500),它正確返回576。

三角函數也可以正常工作。

但上述程序不運行。所以問題在循環中。但是它是什麼?我的意思是,它運行但沒有任何反應。我認爲它可能非常慢,所以我用1替換了500,但它不起作用!哪裏不對?

回答

3

當數字是素數時,while x!=1會使您處於無限循環狀態。這是因爲只有號碼本身可以分割它,而你的range沒有得到這個號碼。

例如,當x是3,5或7(所有素數) -

In [12]: list(range(3,3,2)) 
Out[12]: [] 

In [14]: list(range(3,5,2)) 
Out[14]: [3] 

In [15]: list(range(3,7,2)) 
Out[15]: [3, 5] 

打出來的while x!=1循環的唯一方法是,當x==1,但是這並沒有發生,因爲x從未被自己分開。你可以通過讓你的range走得更遠來避免這種情況。

+0

非常感謝!現在,這是一個愚蠢的錯誤... –

+0

啊我修好了,現在它適用於像60這樣的小數字,但500是太多,它不打印... –

+0

我假設你已經通過添加一個你的範圍。你現在可能需要看看你的算法,第一個有500個除數的三角形數字可能相當大(提示*它是*),而你的算法可能需要很長時間才能找到它......它最終會它確實找到了正確的數字...... –

相關問題