2016-07-22 9 views
1

Ich habe ein Programm erstellt, das erfolgreich erkennt, ob eine Zahl prim ist, oder nicht, es wird auch eine Liste der Faktoren der Zahl zurückgeben, wenn es nicht ist, aber dieser Teil ist nicht erfolgreich.Python: Falsche Ausgabe und ValueError: Prime Factors Creator

ist hier mein Code:

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) 

Wenn ich diese Funktion mit einem "num" Wert von 25 ich diese Ausgabe zu erhalten ...

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] 

, die nicht die korrekte Ausgabe ist Für Primfaktoren möchte ich nur, dass es zurückkehrt: [5] (Ich bin nicht besorgt über die Vielzahl der Faktoren zu diesem Zeitpunkt)

Allerdings, wenn ich die Nummer 50 versuche, wie meine "num". Ich erhalte diese Ausgabe mit einem 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 

Ich weiß, das bedeutet, irgendwie mein x ist nicht in Faktoren, aber ich bin nicht sicher, wie bedenken, dass ich speziell durch Faktoren laufen bin.

+0

Beachten Sie, dass beim Löschen von Werten aus einer Liste beim Durchlaufen derselben Liste einige Elemente übersprungen werden. Iterieren Sie stattdessen eine Kopie: 'für x in Faktoren [:]'. –

Antwort

1

Dies sollte deutlich machen, was dein Problem ist:

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 

Sie über Ihre Faktoren so laufen, die Sie 1 ignorieren und ignorieren die x% x Kombination. Bereich (1,1) ist die leere Liste, und dann halten Sie einfach kurz an, weil Sie den Anfangspunkt um 1 (von Null) erhöht haben, aber nicht den Endpunkt, was Sie zu kurz durchlaufen lassen.

Der Grund, warum Sie einen ValueError erhalten, ist, dass jede nicht-quadratische Zahl (dh nicht 4, 9, 16, 25 usw.) zweimal entfernt wird. Für 6 wird es zum Beispiel für die 2,3-Kombination entfernt, und wenn es zur 3,2-Kombination kommt, wurde es bereits entfernt, daher der Fehler. Eine Möglichkeit, dies zu beheben, besteht darin, den Code nur halb so weit wie möglich minus eins zu setzen, damit die invertierten Zahlen nicht zweimal entfernt werden. Stoppen Sie beispielsweise bei 2 für 6, 4 für 10 usw.

+0

@Rawing Danke, behoben. :) –

+0

Also sollte ich umformatieren es wie folgt aus: 'für x in Faktoren [:]: für y in Bereich (1, x + 1): wenn x% y == 0: factors.remove (x) ' war ich nicht sicher, was Sie, auf halber Strecke minus eins meiner Gesamt gemeint, aber ich bekomme immer noch eine Traceback-Fehler dafür, dass ich das Ende zu erhöhen: ' Faktoren (25) die Faktoren für 25 sind: [1, 5, 25] Traceback (jüngste Aufforderung zuletzt): Datei "" Linie 1 in Faktoren (25) Datei "C: /Users/x/Desktop/Python/primes.py", Linie 42, in Faktoren factors.remove (x) Valueerror: list.remove (x): x nicht in list' – Destroxia

+0

Ich entschuldige mich für den schlampigen Kommentar kann ich keine Zeilenumbrüche in Kommentaren erstellen ... Ich bin neu in diesem Bereich. – Destroxia