2016-04-14 20 views
0

Das Problem ist, dass Sie die Primzahl nach der Eingabe der Zahl finden müssen, oder wenn die Eingabe der Zahl prim ist, geben Sie das zurück. Es funktioniert gut. Es funktioniert einfach nicht, wenn der Eingang print(brute_prime(1000)) ist. Es gibt 1001 nicht 1009. Der vollständige Code ist dies:Suche nach einer Primzahl

def brute_prime(n): 
    for i in range(2, int(n**(0.5))): 
     if n % i == 0: 
      n += 1 
    else: 
     return n 
+1

Sie müssen die Schleife 'for i' immer dann neu starten, wenn Sie' n' erhöhen. – Barmar

+1

Dies ist ein gutes Beispiel dafür, warum es sinnvoll ist, Funktionen in kleinere Funktionen aufzuteilen. Refactor dies, so dass es eine separate "is_prime" -Funktion verwendet, und damit Ihren Fehler vollständig durch Zufall beheben. –

+0

Die 'for' -Schleife muss' range (2, int (n ** 0.5) +1) 'verwenden, da' range' nicht die Endnummer enthält und Sie die Quadratwurzel selbst testen müssen. Sonst wirst du behaupten, dass das Quadrat einer Primzahl ebenfalls Primzahl ist. – Barmar

Antwort

0

Sie sind nicht die for i Schleife neu zu starten, wenn Sie feststellen, dass eine Zahl keine Primzahl ist und auf die nächste Nummer gehen. Dies hat zwei Probleme: Sie überprüfen nicht, ob die nächste Zahl ein Vielfaches der Faktoren ist, die Sie zuvor überprüft haben, und Sie erhöhen auch nicht das Ende des Bereichs auf int(n ** 0.5) mit dem neuen Wert n.

def brute_prime(n): 
    while true: 
     prime = true 
     for i in range(2, int(n ** 0.5)+1): 
      if n % i == 0: 
       prime = false 
       break 
     if prime: 
      return n 
     n += 1 

break beendet die for Schleife und while true: wird es neu starten, nachdem n erhöht wurde.

+0

'n ++' ist keine gültige Python-Syntax, verwenden Sie 'n + = 1' – Copperfield

0

Wie Barmar empfiehlt, müssen Sie die Schleife jedes Mal neu starten, wenn Sie n erhöhen. Ihr Bereich endet auch früher als es sollte, da ein Bereich kurz vor dem zweiten Argument endet.

def brute_prime(n): 
    while True: 
     for i in range(2, int(n**(0.5)) + 1): 
      if n % i == 0: 
       break 
     else: 
      return n 
     n = n+1 
0

erinnern 2 ist eine Primzahl. wieder können Sie einfach die Division durch 2 überprüfen und

def brute_prime(n): 
     while True: 
      if n==2:return n 
      elif n%2 ==0 or any(n % i==0 for i in range(3, int(n**(0.5)+1),2)): 
       n += 1 
      else: 
       return n 
0

wie erwähnt von Chris Martin die kluge Lösung, eine isPrime Funktion separat alle gerade Zahl Division überspringen ist zu definieren und es verwenden, um Ihre Wunsch-Nummer zu erhalten.

zum Beispiel wie dieses

def isPrime(n): 
    #put here your favorite primality test 

from itertools import count 

def nextPrime(n): 
    if isPrime(n): 
     return n 
    n += 1 if n%2==0 else 2 
    for x in count(n,2): 
     if isPrime(x): 
      return x 

, wenn die angegebene Zahl nicht prim ist, mit n += 1 if n%2==0 else 2 es uns auf die nächste ungerade Zahl ist und mit count Check jede ungerade Zahl von diesem Punkt zu bewegen.

für isPrime Test Division ist in Ordnung für kleine Zahlen, aber wenn Sie es mit größeren Zahlen verwenden möchten, empfehle ich die Miller-Rabin test (deterministic version) oder die Baille-PSW test. Sie können hier eine Python-Implementierung beider Versionen des Miller-Tests finden: http://rosettacode.org/wiki/Miller%E2%80%93Rabin_primality_test#Python