2016-11-27 5 views
0

Ich versuche, alle Primzahlen in einen Bereich von gegebenen Zahlen (niedrig und maximal, einschließlich Zahlen enthalten) zu drucken.Drucken Primzahlen in einem Bereich von gegebenen Zahlen

Zum Beispiel:

num1 = 10, num2 = 20

>>> 11, 13, 17, 19

Mein Code nicht in einigen Gelegenheiten und ich kann nicht verstehen, warum:

num1 = int(input('First number is: ')) 
num2 = int(input('Second number is: ')) 
if num2 <= num1: 
    num1,num2 = num2,num1 
for i in range(num1, num2+1): 
    for p in range(2,int(num2**0.5)+1): 
     if i%p == 0: 
      break 
    else: 
     print(i,' ',end = '') 
print('\n') 

Ergebnisse:

1 bis 7 >>> 1 3 5 7 (weglässt 2)

1 >>> 30 zu 1 7 11 13 17 19 23 29 (weglässt 2,3,5)

1 >>> 60 1 7 11 13 17 19 23 29 (weglässt 2,3,5,7)

0 bis 0 0 >>> (prints 0 -> keine Primzahl)

0 bis 7 >>> 1 3 5 7 (keine 2)

Wie kann Ich korrigiere das? Vielen Dank!

ps. Nummer 1 ist auch kein Prime.

+1

Wenn num2

+0

@MarkTolonen, ich habe danach gesucht. Danke für den Tipp, ich habe die Frage bearbeitet. –

Antwort

2

Der Fehler im Code wurde keine i im zweiten Teil des Innen für Loop-Bereich, wie zum num2 Gegensatz

num1 = int(input('First number is: ')) 
num2 = int(input('Second number is: ')) 
if num2 > num1: 
    num1, num2 = num2, num1 
for i in range(num1, num2+1): 
    if i == 0 or i == 1: continue 
    for p in range(2,int(i**0.5)+1):  # the second part should be int(i**0.5) + 1, not int(num2**0.5)+1 
     if i%p == 0:  
      break  

    else: 
     print(i,' ',end = '') 

auch eher als num1 < num2 für zwei Verzweigungen und umgekehrt , Sie können etwas wie unten tun. Im Hinblick auf das Code-Design wäre es besser, dies leicht in eine is_prime-Methode zu zerlegen. Auf diese Weise könnten Sie, wenn Sie jemals einen schnelleren Primalitätstester schreiben möchten, die Hilfsfunktion einfach bearbeiten, anstatt mit dem Hauptcode zu spielen.

def is_prime(num): 
    if i == 1: return False 
    for p in range(2,int(num**0.5)+1): 
     if num % p == 0: 
      return False 
    return True 

inp1 = int(input('First number is: ')) 
inp2 = int(input('Second number is: ')) 

num1 = min(inp1, inp2) 
num2 = max(inp1, inp2) 

for i in range(num1, num2+1): 
    if is_prime(i): 
     print(i,' ',end = '') 

print('\n') 
+0

Einige Ihrer "Korrekturen" sind falsch. Das 'for' /' else' ist nicht falsch. Das ist ein gültiges Konstrukt in Python. Das "else" wird ausgeführt, wenn "for" abgeschlossen ist, was bedeutet, dass die Zahl prim war. Die Pause stoppt das 'for', sobald die Zahl nicht als prime gefunden wird ... kein Grund,' prime = False' zu ​​setzen und weiter zu prüfen. –

+0

@MarkTolonen Das ist wild. Ich hatte keine Ahnung. Danke, ich werde die Antwort bearbeiten. Klar habe ich zu viel C++ gemacht – gowrath

+0

FYI, 'while' /' else' ist auch gültig. –

1

Sie haben die Teilung der Zahl durch die Zahl selbst nicht berücksichtigt. dh wenn der Bereich 1 bis 30, sqrt (30) +1 = 5 + 1 = 6 war, hatten alle nos unter sechs einen Fall, in dem sie durch die Zahl selbst geteilt wurden als 2% 2,3% 3 ... i% ich.

Abhilfe wäre der Bereich der inneren for-Schleife zu ändern:

for i in range(num1, num2+1): 
    for p in range(2,int(i**0.5)+1): #Change num2 to i to avoid i%i 
     if i%p == 0: 
      break 
    else: 
     print(i,' ',end = '') 

Es ist besser, zu abstrahieren, den Code wie die von gowrath getan Fehler zu vermeiden.

Verwandte Themen