2017-04-19 54 views
1

我必須編寫一個函數因子,它需要一個整數參數n,並返回從2到n-1的最小數,除以n。如果不存在這樣的數字,則返回-1。Python中的細化因子

我能夠創建函數來查找這些因子,但我不確定如何改進它以返回正確的結果。

def factors(n): 
    i = n 
    lst=[] 
    while i > 0: 
     if n % i == 0: 
     lst.append(i) 
     i -= 1 
    print(lst) 
    result=[i for i in lst if i > 2 and i < n-1] 
    print(result[1]) 



def main(): 
    n=int(input("Enter n:")) 

    factors(n) 

main() 
+2

你沒有在你的'因素(N)' – haifzhan

+1

歡迎StackOverflow的任何回報。請閱讀並遵守幫助文檔中的發佈準則。 [最小,完整,可驗證的示例](http://stackoverflow.com/help/mcve)適用於此處。在發佈您的MCVE代碼並準確描述問題之前,我們無法爲您提供有效的幫助。具體來說,你的程序目前在做什麼,它在哪裏失敗? – Prune

回答

3

您可以使用列表理解來查找數字的因子。另外,爲了優化您的解決方案,您只需要運行一半的數量。

例如對於12,最大因子12可以是6.

大於該數的一半的數字不能作爲其因子。所以,你不需要運行你的循環,直到n-1

>>> [n for n in range(2, number/2+1) if number % n == 0] 

在上面的線,我們會從2 to (number/2 + 1)運行一個循環,並檢查數量是整除N,然後將其添加到列表中。

1

factor功能應該從最小的值,然後再開始增加

def factor(n): 
    i = 2 
    while i < n: 
     if n % i == 0: 
      return i 
     i += 1 
    return -1 

>>> factor(6) 
2 
>>> factor(21) 
3 
>>> factor(49) 
7 
>>> factor(13) 
-1 

然後factors可以調用

def factors(n): 
    values = [1] 
    while n > 1: 
     f = factor(n) 
     if f > -1: 
      values.append(f) 
      n //= f 
     else: 
      values.append(n) 
      break 
    return values 

>>> factors(21) 
[1, 3, 7] 
1

你在這裏做了很多不必要的工作:你發現全部因素,而不是最小的。但是,您在指尖上有一個正確的答案:您打印第二個元素作爲最低因子,但是您的列表的順序相反。嘗試

print lst[-2] 

那說你真的應該不是所有的打擾。相反,從2開始向上工作,尋找最小的因子。如果你沒有找到sqrt(n),返回-1。

+0

Upvote教學方法。你應該通過更好的方式添加提示。 – kabanus

+1

我是這麼做的,關於您輸入評論的時間。 – Prune

+0

談論時機。不能upvote兩次:) – kabanus

0

這裏是2或N-1之間發現了一些因素的優化方式:

def factor(n): 
    i=2 
    a=[] 
    while i*i<=n: 
     if n%i==0: 
      if i!=n/i: 
       a.append(i) 
       a.append(n/i) 
      else: 
       a.append(i) 
     i+=1 
    a.sort() 
    print a 

n=int(input()) 
factor(n)