2017-02-27 2 views
0

Ich entschuldige mich, wenn ich dies nicht ordnungsgemäß betitelt habe, aber ich habe Probleme, den folgenden Code auszuführen. Die Parameter der for-Schleife scheinen zumindest ein Teil des Problems zu sein. Wenn ich in der for-Schleife "limit" für "num" einsetze, um "für j im Bereich (1, limit)" zu erhalten, wird die Schleife ausgeführt und gibt die gewünschte Ausgabe an. Aber mit num anstelle von limit, sollte ich in der Lage sein, Iterationen der Schleife genauer zu steuern, aber es wird nicht abgeschlossen, zeigt aber keinen Fehler.Python: Loop-Parameter

from collections import Counter 

limit = int(input('What number do you want to factor?')) 
num = limit 
factors = [] 
while num != 1: 
    for j in range(2, num):   
     if (num % j == 0): 
      num = num // j 
      factors.append(j) 
      break 

factorEnum = Counter(factors) 

print(factors) 
print(factorEnum) 

Der Zweck des Codes besteht darin, eine Primfaktorzerlegung einer gegebenen Zahl zu erzeugen. Zum Beispiel sind für die Zahl 28 die Primfaktoren {2, 7}, aber ich suche nach einer Primfaktorzerlegung, die {2, 2, 7} wäre. Dieser Code ist Teil eines anderen Skripts, das nach dem kleinsten gemeinsamen Vielfachen eines Zahlenbereichs sucht (z. B. 1 - 40). Dies ist ein Problem von ProjectEuler.

+0

'if (num% j == 0):' Wenn das nicht wahr ist, änderst du 'num' nicht, damit deine Schleife für immer läuft. Und angenommen, dass 'num' 2 ist, dann' für j im Bereich (2, num) 'nicht läuft, wird num nicht verringert und das Gleiche passiert. – tdelaney

+0

Fügen Sie ein paar Drucke hinzu und Sie werden sehen, wo es schief geht. Besser noch, führe es im Debugger 'pdb3' aus. – tdelaney

+0

@tdelaney Das wäre nur wahr, wenn der Wert von 'j' zu irgendeinem Zeitpunkt nicht gleich 'num' wäre. Selbst wenn die Zahl prim wäre, würde sie immer noch durchlaufen, bis 'j == num' und 'num' auf 'num' // 'j' gesetzt würde, was 1 wäre. Dann beendet die break-Anweisung die for-Schleife und die Der Wert von 'num' ist 1 und verlässt die while-Schleife. ... Ich denke. – KhromRol

Antwort

0

Siehe die Kommentare von Tdelaney oben. Das hat mein Problem ziemlich gelöst.

Da die 'Bereich'-Funktion nicht den Endpunkt enthält, wird die for-Schleife nie beendet. Dies gilt für jede Nummer. Aber mit 'limit' wird der Bereich der for-Schleife über den Wert von 'num' hinaus für alle Zahlen außer Primzahlen erweitert. "Limit" funktioniert also, wenn die Zahl nicht prim ist.

Ich habe den Code in 'num + 1' als zweiten Parameter geändert und das hat gut funktioniert.

Dank @tdelaney.