2017-02-24 5 views
4

Ich implementiere das Sieb von Eratosthenes in Python. Sie gibt zerlegbare Zahlen am Ende des Suchbereiches:Sieb von Eratosthenes gibt große zusammengesetzte Zahl zurück (was ein Fehler ist)

def primes_Ero(n=1000): 
    primes = [] 
    a = [True]*(n+1) 
    a[0] = a[1] = False 
    for (i,isprime) in enumerate(a): 
     if isprime: 
      for n in range(i*i,n+1, i):   
       a[n] = False 
      primes.append(i) 
    return primes 

Wenn größere Zahlen verwenden, n ich mit zusammengesetzten Zahlen enden. Ich habe einen Scheck, um zu sehen, welche Zahlen sind zusammengesetzte (verglichen mit einem Brute-Force-Methode),

n Gegeben, was Zahlen sind Composite:

n= 100; [] 
n= 500; [493, 497] 
n= 1000; [961, 989] 
n= 10000; [9701, 9727, 9797, 9853, 9869, 9917, 9943, 9953, 9983, 9991, 9997] 

Was mache ich falsch?

+0

Was ist die Absicht von 'if i == 31:'? –

+5

Außerdem verwenden Sie 'n' für zwei verschiedene Dinge. –

+1

@PaulHankin hat es. Ändern Sie die Variable in der inneren for-Schleife, z. B .: 'für k im Bereich (i * i, n + 1, i):' und das Problem verschwindet. – jas

Antwort

4

Das Problem ist, diese Zeile:

for n in range(i*i, n+1, i): 

Anfänglich n den Parameterwert (default = 1000) gesetzt ist, aber nach der for-Schleife zum ersten Mal ausführt n i < n < i + n halten wird. Das zweite Mal, wenn die for-Schleife ausgeführt wird, ist fehlerhaft.

Sie sollten eines der von Ihnen verwendeten n s umbenennen. Überlegen Sie, ob Sie ihm einen richtigen Namen wie sieve_size geben sollten, was aussagekräftiger ist, was er tatsächlich tut.

Eine Sache, die ich hervorheben möchte, ist, dass während Ihr Code ist klug Sie sind Änderung der Liste, die Sie iterieren über. Dies wird allgemein als schlechte Praxis angesehen.

+1

Danke für das! Ich habe ein paar verschiedene Ideen zusammengestellt und vergessen, die Teile in etwas Beschreibendes umzubenennen. Das hat sehr geholfen. – LascieL

+0

Ein Kommentar zu Ihrem letzten Absatz: Es gibt kein Problem damit, den Wert einer Liste nach Index zu ändern, während Sie über die Liste iterieren. Es ist nur ein Problem, wenn Sie Werte aus der Mitte der Liste einfügen oder entfernen (da dies die Indizes aller späteren Werte ändert). – Blckknght

Verwandte Themen