2016-07-22 8 views
1

数字が素数であるかどうかを正しく検出するプログラムを作成しましたが、そうでない場合は数値の要素のリストも返しますその部分は成功しません。 ...私は25の「NUM」の値でこの機能を使用する場合、私はこの出力を得るPython:間違った出力とValueError:素因数作成者

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) 

正しく出力されません
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] (私はこの時点での要因の多重度を心配していない)

しかし、私は私の "num"として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 factors [:]'。 –

答えて

1

これはあなたの問題が何であるか、それを明確にする必要があります:あなたは1を無視し、X%Xの組み合わせを無視するような方法であなたの要因を反復している

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 

。 range(1,1)は空のリストであり、開始点を1(ゼロから)増加させて終了点を増加させていないので、単純に停止します。

ValueErrorを取得するのは、非正方形の数値(つまり、4,9,16,25などではない)が2回削除されるためです。たとえば6の場合、2,3のコンボが削除され、3,2のコンボになったら削除されているため、エラーになります。この問題を解決する1つの方法は、コードを半分から1つだけマイナス1にして、逆数を2回削除しないようにすることです。たとえば、6で2、または10で4などで停止します。

+0

@Rawingありがとうございました。 :) –

+0

だから、私はこのようにそれを再フォーマットする必要があります。 'X要因に[:]:範囲内のyの (1、X + 1): 場合のx%のY == 0: factors.remove(X ) ' は、私はあなたが私の合計、 に、途中でマイナス1を意味かわからなかったが、私はまだトレースバックエラーは、私があまりにも終わりを増やす確認してもらう:25要因がある '要因(25): [1、5、25] トレースバック(最新のコールの最後): 要素(25) に ファイル ""、行1、ファイル "C:/Users/x/Desktop/Python/primes.py"、42行目、ファクタ: factors.remove(x) ValueError:list.remove(x):xリストにはない – Destroxia

+0

私は謝罪しますお粗末なコメントのために、私はコメントに改行を作成するように見えることができない...私はこれに新しいです。 – Destroxia

関連する問題