2017-02-07 2 views
1

Dieses Programm erstellt eine Liste aller Primzahlen kleiner oder gleich einem bestimmten Eingang.Primzahl-Finder einschließlich 2 mehrfache

Dann druckt es die Liste.

Ich kann nicht verstehen, warum es die Nummer 2 enthält Als ich das Programm, initialisiert ich die Liste mit Primzahlen = [2], weil ich dachte, da 2% 2 == 0,

if n % x == 0: 
    is_prime = False 

wird is_prime zu False gesetzt. Dies scheint jedoch nicht der Fall zu sein.

Ich bin mir sicher, dass etwas mit der Logik von meinem range() in den for Schleifen, die ich gerade nicht verstehe, los ist.

Ich denke, meine Frage ist: Warum ist jedes Mal 2 in der Liste der Primzahlen enthalten?

import math 


limit = int(input("Enter a positive integer greater than 1: ")) 

while limit < 2: 
    limit = int(input("Error. Please enter a positive integer greater than 1: ")) 

primes = [] 

#Check all numbers n <= limit for primeness 
for n in range (2, limit + 1): 
    square_root = int(math.sqrt(n)) 
    is_prime = True 

    for x in range(2, (square_root + 1)): 
     if n % x == 0: 
      is_prime = False 

    if is_prime: 
     primes.append(n) 

#print all the primes 
print("The primes less than or equal to", limit, "are:") 
for num in primes: 
    print(num) 
+0

Sie können diesen Code erheblich beschleunigen, indem Sie 'break' nach' is_prime = False' hinzufügen. Betrachten Sie die Zahl 10.000. Sie würden 10000% 2 überprüfen, würde dann is_prime = false setzen, dann würden Sie 10000% 3, 10000% 4 usw. überprüfen, obwohl Sie wissen, dass es nicht Prime ist – Keatinge

+3

2 selbst ist ein Prime, was ist los damit? – armnotstrong

Antwort

1

Weil Sie nicht über die zweite for -loop eingeben, wenn Sie für n=2 testen und daher legen Sie kein is_prime = False.

# Simplified test case: 
x = 2 
for idx in range(2, int(math.sqrt(x))+1): 
    print(idx) 

Dies gilt nicht print nichts, weil range in diesem Fall: range(2, 2) und hat daher die Länge Null.


Beachten Sie, dass Ihr Ansatz nicht wirklich effizient ist, weil:

  • Sie jede Zahl von allen möglichen Teilern testen, auch wenn Sie bereits herausgefunden, es ist keine Primzahl.
  • Sie schließen nicht ein Vielfaches von Primzahlen in Ihren Tests: wenn 2 eine Primzahl ist, kann jeder Vielfaches von 2 keine Primzahl sein usw.

Es gibt wirklich große Funktionen für erwähnt Primzahlen zu finden in Fastest way to list all primes below N - also werde ich nicht darauf eingehen. Aber wenn Sie an Verbesserungen interessiert sind, sollten Sie vielleicht einen Blick darauf werfen.