2016-08-01 14 views
0

ich diese Frage als eine Übung bin versucht, aber ich bin stuck.I werden versuchen, so präzise wie möglich zu seindie Summe von Primzahlen in einer Liste in Python zu finden

Ich mag die Summe von Primzahlen finden die Liste als Eingabe

die Eingabe in meiner Funktion gegeben Say ist eine Liste wie = [17,51,29,39], es sollte also 46 als Antwort zurück, wie 17 + 29 = 46

Hier der Code, den ich schreiben könnte:

def sumprimes(l): 
    sum=0 
    for value in l: 
     for i in range(1,float((value)/2)): 
      if value%i==0: 
         sum+=value  
    print(sum) 

Hinweis-bei der Übergabe einer Liste sollte das Programm funktionieren. Ich habe diesen Teil nicht geschrieben.

Vielen Dank im Voraus

+2

Warum nicht mit der Herstellung einer separaten Funktion starten 'def is_prime (n)', die angibt, ob eine Zahl prim oder nicht. – wim

Antwort

1

Sie sollten eine Funktion erstellen, um zu testen, ob die Nummer prim ist, wie @wim gesagt hat.

def is_prime(n): 
    if n < 2: 
     return False 
    elif n <= 3: 
     return True 
    elif n % 2 == 0: 
     return False 

    # round up the sqrt of n 
    length = int(n**.5) + 1 # n**.5 is equal to sqrt(n) 
    for i in range(3, length, 2): 
     if n % i == 0: 
      return False 

    return True 

Dies ist ein einfacher und effizienter Primzahltest. Dann können Sie einfach mit Zusammengefasst:

def sum_primes(l): 
    return sum(n for n in l if is_prime(n)) 
+0

Sie könnten dies effizienter machen. 'Klasse IsPrime :; def __init __ (Selbst) :; self.prime_set = set ([2]); def is_prime (selbst, n); wenn n in self.prime_set: true zurückgibt; # 2 ist immer im Satz, so dass jede gerade Zahl, die hier ankommt, nicht prim ist; wenn nicht n% 2: return false; Länge = int (n **. 5) + 1 # n **. 5 ist gleich sqrt (n); für i in Reichweite (3, Länge, 2) :; wenn n% i == 0 :; Rückgabe Falsch; self.prime_set.add (n); return True; 'Dies ist eine einfache Ergänzung eines Sets, um die zuvor gefundenen Primzahlen zu speichern. Dies erspart den Aufwand, sie neu zu generieren. – Baldrickk

+1

Eine alternative Methode wäre, alle Primzahlen bis zum Wert zu generieren. Dies ermöglicht zwei weitere Optimierungen: 1) Wenn der Wert nicht in der Menge ist, aber ein Wert in der Menge größer als er ist, dann ist er nicht prim. 2) Für Werte, die größer als die größte Primzahl sind, müssen Sie nur gegen bekannte Primzahlen testen, nicht alle ungeraden Zahlen bis zu diesem Wert. Dies wäre für einen einzelnen Aufruf weniger effizient, würde jedoch bei vielen Aufrufen von is_prime(), wie sie von dem Fragenden gestellt werden, weitaus effizienter sein. – Baldrickk

1

Das Problem mit Ihrem Code ist, dass Sie range mit Float-Wert verwenden. Was Sie wirklich brauchen, ist die Integer Division. In Python 3, das heißt der // Betreiber:

def sum_primes(l): 
    total = 0 
    for value in l: 
     for i in range(2, value // 2): 
      if value%i == 0: 
       break 
     else: 
      total += value  
    return total 

Auch Sie müssen überprüfen, ob Wert von jeder Zahl außer 1 und sich selbst teilbar ist. Alle Zahlen sind durch 1 teilbar. Also starte den Bereich von 2. Außerdem sind Zahlen teilbar, die keine Primzahlen sind, also füge eine else-Klausel zu deiner for-Schleife hinzu, die nur ausgeführt wird, wenn deine for-Schleife geht Vervollständigung ohne Unterbrechung, dh keine der von Ihnen überprüften Zahlen teilen den Wert, daher ist der Wert prim!

1

Hier ist die Lösung für Ihre Fragen ist

def sumprimes(l): 
primeNum = [] 
for item in l: 
    is_prime = True 
    if(item >= 2): 
     maxInt = int(item ** 0.5) + 1 
     for i in range(2, maxInt): 
      if(item % i == 0): 
       is_prime = False 
       break 
     if(is_prime): 
      primeNum.append(item) 
return(sum(primeNum)) 

print(function([-3,1,6]))