2017-05-07 61 views
0

所以我對Python很新,想知道爲什麼這些代碼不適用於某些數字。 (例如,12和60)(編輯:它只是說一個因素,那就是不是素數有12個是4,和60是12)爲什麼不在Python中最大的主要因素代碼

def Prime(var): 
    for n in range(var-1, 1, -1): 
     if var % n == 0: 
      for x in range(2, n): 
       if n % x == 0: 
        n = n-1 
        continue 
      else: 
       if (var % n == 0): 
        print("the largest prime factor of", var, "is", n) 
        break 
       n = n-1 
       continue 
      break 
    else: 
      print(var, "is already a prime number") 

Im相當肯定,有多個線路代碼是不需要的,而且這段代碼簡直沒有效率,但是我不明白爲什麼這樣做不起作用。所以,如果有人能幫助我解決這個問題,那就太好了。

在此先感謝

+1

解釋**如何**它不起作用。有沒有錯誤,或者它只是產生錯誤的輸出? – m0dem

+0

@JohnColeman我懷疑第一行的所有內容都需要縮進一層,這是因爲OP不熟悉SO代碼塊的工作原理。 –

+0

在Stack Overflow中發佈代碼可能會非常棘手。在諸如Java這樣的語言中,這並不重要,但是在Python中,它可能會無可救藥地歪曲邏輯。在實踐中,我們可以猜出你的意思,但有時候我們猜錯了。我建議簡單地刪除代碼,然後在閱讀以下內容後將它重新加入:https://meta.stackexchange。com/questions/22186/how-do-i-format-my-code-blocks –

回答

0

你的函數某些值失敗,因爲它假定,如果nvar然後n-1沒有。對於6的倍數,這是不正確的。 n = 3n-1 = 2都將其分開。 (對於60,該問題也隨着6和5出現)。

您的核心邏輯是首先找到一個除數,然後檢查(通過詳盡的試驗除法)該除數是否爲質數。你的邏輯很複雜,因爲你試圖讓你的功能打印的結果。這是一個更簡潔的設計,只需要功能返回最大的素數,並留下任何打印到調用代碼。

你的核心算法可以表述如下:

def largest_prime(var): 
    """"returns the largest prime divisor of var""" 
    for n in range(var-1,1,-1): 
     if var % n == 0: 
      #check if n is prime, if so - return it 
      for x in range(2,n): 
       if n % x == 0: 
        #n isn't prime, so 
        break 
      else: 
       return n #if we get here, we know that n is prime 
    return var #we only get to this point if no divisors of var have been found 

例如:

>>> largest_prime(60) 
5 
>>> largest_prime(12) 
3 
>>> largest_prime(7) 
7 

前兩種情況是你的代碼沒有案件。

該代碼仍然是效率很低,但由於數字理論的原因比Python更多。

On編輯:這是一個更高效但仍不是最佳方法來找到最大的素數。它基於首先找到最小的素數,將數字除以該素數,然後比較素數與所得商的最大素數。它利用一個事實,即一個數的最小素因子小於或等於其平方根:

import math 

def biggest_prime(var): 
    for p in range(2,1 + math.ceil(math.sqrt(var))): 
     if var % p == 0: 
      return max(p,biggest_prime(var//p)) 
    return var 

兩個largest_prime(10**7 + 1)biggest_prime(10**7 + 1)回報909091,但第一個功能需要幾秒鐘,而第二個是幾乎瞬間。對於biggest_prime(10**9 + 1)largest_prime(10**9+1),結果更加戲劇性。幾分鐘後我沒有輸出,但是biggest_prime(10**9 + 1)仍然幾乎是瞬間的,我殺了largest_prime(10**9+1)

+0

謝謝,但你能解釋我,爲什麼這不應該與打印? – Erratum

+0

不知道如何在評論中發佈代碼,但我只是用第一個'return'代替了print函數和break代碼,而第二個代碼使用了'else'語句和'print'函數在裏面。這似乎是完美的 – Erratum

+0

如果在打印後立即有「返回」(或「中斷」),它將與'print'一起工作。一旦你知道最終結果應該是什麼,就沒有必要確保你的代碼正確地傳遞了函數的其餘部分。我上面寫的代碼假設,如果你到了底線,那麼你就知道'var'是排除過程的主要部分。如果你之前沒有回來,那邏輯就會崩潰。當然你可以做不同的事情,但是通常函數應該返回值而不是打印結果。 –

相關問題