2016-08-01 3 views
0

Я пытаюсь этот вопрос в качестве упражнения, но я stuck.I будет стараться быть как можно более точнымнайти сумму простых чисел в списке в Python

Я хотел бы найти сумму простых чисел с список в качестве входного сигнала

Say входа, данного моей функции является списком, как = [17,51,29,39], поэтому он должен вернуть 46 в качестве ответа, как 17 + 29 = 46

Вот код, который я мог бы написать:

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) 

При переносе списка программа должна работать. Я не написал эту часть.

Заранее спасибо

+2

Почему бы не начать с созданием отдельной функции 'Защита is_prime (п)', который говорит ли один число является простым или нет. – wim

ответ

1

Лучше создать функцию, чтобы проверить, является ли число простым, как указано в @wim.

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 

Это простой и эффективный тест прочности. Тогда вы можете просто просуммировать с:

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

Вы можете сделать это более эффективным. 'class IsPrime :; def __init __ (self) :; self.prime_set = set ([2]); def is_prime (self, n); если n в self.prime_set: return true; # 2 всегда находится в наборе, поэтому любое четное число, которое здесь получает, не является простым; если не n% 2: return false; length = int (n **. 5) + 1 # n **. 5 равно sqrt (n); для i в диапазоне (3, длина, 2) :; , если n% i == 0 :; return False; self.prime_set.add (n); return True; 'это простое дополнение набора для хранения ранее найденных простых чисел. это экономит хлопоты за их повторное создание. – Baldrickk

+1

Альтернативным методом было бы сгенерировать все простые числа до значения. Это позволяет еще две оптимизации: 1) если значение не находится в наборе, но есть значение в наборе больше, чем оно, то оно не является простым. 2) для значений, больших, чем наибольшее простое, вам нужно только проверить против известных простых чисел не все нечетные числа до этого значения. Это было бы менее эффективно для одного вызова, но было бы гораздо более эффективным для многих вызовов is_prime(), задаваемых вопросителем. – Baldrickk

1

Проблема с кодом является то, что вы используете range со значением с плавающей точкой. Что вам действительно нужно, это целочисленное деление. В Python 3, то есть // оператор:

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 

Кроме того, вам нужно проверить, если значение делится на каждый номер, кроме 1 и самого себя. Все числа будут делиться на 1. Итак, запустите диапазон от 2. Кроме того, это числа, которые являются делимыми, которые не являются первичными, поэтому добавьте предложение else к вашему for-loop, который выполняется только в том случае, если ваш for-loop переходит к завершение без разрыва, т. е. ни один из отмеченных вами чисел не делит значение, поэтому значение является простым!

1

Вот решение для ваших запросов

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])) 
Смежные вопросы