2017-10-09 119 views
-6

我已經編寫了解決Euler Project No 12的代碼,但是我的代碼運行緩慢。如何讓此代碼更快?

如何讓它運行得更快?我已閱讀了一些有關尋找除數的建議,但我不明白使用sqrt代替n的邏輯。

你能解釋一下它的邏輯嗎?

這裏是我的代碼:如果a * b = nn

def sumdiv(n): 
    l=[d for d in range(1,int(n/2)+1) if n%d==0] # used n/2 to short loop 
    return len(l)+1 # added n itself 
trnums=[1,3] 

while sumdiv(trnums[-1])<=501: 
    k=trnums[-1]-trnums[-2]+1 
    trnums.append(trnums[-1]+k) 
print(trnums[-2:]) 
+1

使用'[d在範圍d (1,int(math.sqrt(n))+ 1)if n%d == 0]',你在這點之後沒有找到任何除數。這將_will_讓你的代碼更快。 –

+0

我已經知道這種方法,但我需要邏輯使用sqrt –

+2

是你的問題「爲什麼我應該停在'int(math.sqrt(n))+ 1'? – Adirio

回答

0

ab是除數。您可以在不失一般性的情況下設置b >= a。因此a * a是上限;即您只需考慮幷包括n的平方根。一旦你有一個a,你可以平凡地推斷b

您可以設置上限爲d * d <= n,而不是d <= sqrt(n)所以避免平方根的任何計算。這仍然會稍微快一點。

+0

lest take f或示例28. –

+0

28的除數是1,2,4,7,14,28。我改變了我的代碼。但是asnwer是錯的 –

+0

n = 28 (i,範圍(1,int(n ** 0.5)+1): 如果n%i == 0: print(i) –

0

你只是想知道除數的數量:總有偶數個約數,因爲每個dividor x

對於任何數量N需要由另一y這本身就是除如果N除數相乘x=sqrt(N)指定了一個整數結果,因爲這意味着x*x=N並且這將是唯一的數字。因此,除了sqrt(N),如果結果是除數,則每個除數都會成對分組。

那你第一次檢查,如果根是一個除數,然後只計算,直到它並添加兩到計數每次爲其餘的將永遠是對的:

def number_of_divisors(n): 
    root = math.sqrt(n) 
    if root == int(root): 
     number = 1 
     limit = int(root) 
    else: 
     number = 0 
     limit = int(root) + 1 
    for i in range(1, limit): 
     if (n % i) == 0: 
      number += 2 
    return number 

i = 1 
s = 1 
while number_of_divisors(s) < 501: 
    i += 1 
    s += i 

print(i) # 12375 
print(s) # 76576500 
print(number_of_divisors(s)) # 576