2016-07-22 60 views
1

我已經創建了一個程序,可以成功檢測到一個數字是否爲素數,如果不是,它也會返回一個數字因子列表,但是那部分不成功。Python:錯誤的輸出和ValueError:Prime因素造物主

這裏是我的代碼:

def prime_num(): 

    num = int(input("Give me a number...: ")) 
    prime = True 

    if num == 1: 
     prime = False 
    elif num == 2: 
     prime = True 

    for x in range(2, num): 
     if num % x == 0: 
      prime = False 
      break 

    if prime == False: 
     print("That's not a prime number!") 
     factors(num) 
    elif prime == True: 
     print("That's a prime number!") 


def factors(num): 

    factors = [] 

    for x in range(1, num+1): 
     if num % x == 0: 
      factors.append(x) 
    print("The factors for " + str(num) + " are: ", factors) 

    for x in factors: 
     for y in range(1, x): 
      if x % y == 0: 
       factors.remove(x) 
    print("The prime factors for " + str(num) + " are: ", factors) 

當我使用該功能的25我得到這個輸出「編號」值...

prime_num() 

Give me a number...: 25 
That's not a prime number! 
The factors for 25 are: [1, 5, 25] 
The prime factors for 25 are: [1, 25] 

哪項不正確的輸出對於主要因素,我只是希望它返回:[5] (我不擔心這個因素的重要性)

但是,當我嘗試數字50,作爲我的「數字」。我得到這個輸出,一個ValueError:

prime_num() 

Give me a number...: 50 
That's not a prime number! 
The factors for 50 are: [1, 2, 5, 10, 25, 50] 
Traceback (most recent call last): 

    File "<ipython-input-19-12c785465e2a>", line 1, in <module> 
    prime_num() 

    File "C:/Users/x/Desktop/Python/Python Practice/primes.py", line 25, in prime_num 
    factors(num) 

    File "C:/Users/x/Desktop/Python/Python Practice/primes.py", line 40, in factors 
    factors.remove(x) 

ValueError: list.remove(x): x not in list 

我知道這意味着不知我的X不在因素,但我不知道怎麼考慮,我特別是通過迭代的因素。

+0

請注意,在迭代同一列表時從列表中刪除值將跳過某些元素。迭代迭代:'for x [in] [:]'。 –

回答

1

這應該說清楚你的問題是什麼:

factors = [1,5,25] 

for x in factors: 
    for y in range(1,x): 
     print x,y 

5 1 
5 2 
5 3 
5 4 
25 1 
25 2 
25 3 
25 4 
25 5 
25 6 
25 7 
25 8 
25 9 
25 10 
25 11 
25 12 
25 13 
25 14 
25 15 
25 16 
25 17 
25 18 
25 19 
25 20 
25 21 
25 22 
25 23 
25 24 

你遍歷你的因素,你忽略了1而忽略了X%×組合的方式。範圍(1,1)是空列表,然後你簡單地停下來,因爲你已經將開始點增加了1(從零開始),而不是結束點,使得迭代過短。

你得到一個ValueError的原因是因爲任何非平方數(即不是4,9,16,25等)將被刪除兩次。例如,對於6,它將刪除2,3組合,並且當它到達3.2組合時,它已經被刪除,從而出現錯誤。解決這個問題的一個方法是讓代碼只能在總數中減去一半,這樣倒置的數字不會被刪除兩次。例如,停止在2爲6,4停止10等。

+0

@Rawing謝謝,修復。 :) –

+0

所以應該予格式化它是這樣的: '對於x在因素[:]: 有效範圍內的Y(1,X + 1): 如果x%Y == 0: factors.remove(X )' 我不知道你的意思,中途減一來我總, 但我仍然得到一個回溯錯誤確保我增加太底: '因素(25) 25的因素有: [1,5,25] 回溯(最近最後調用): 文件 「」,第1行,在 因素(25) 文件「C:/Users/x/Desktop/Python/primes.py」,第42行,因子爲 factors.remove(x) ValueError:list.remove(x):x不在列表中 – Destroxia

+0

我道歉對於馬虎評論,我似乎無法在評論中創建換行符......我是新手。 – Destroxia