I am Trying this question as an exercise but i am stuck.I will try to be as precise as possible
I would like to find the sum of primes with the list as an input
Say the input given to my function is a list like=[17,51,29,39],so it should return 46 as the answer as 17+29=46
Here’s the code what i could write:
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)
Note-on passing a list,the program should work. I haven’t written this part.
Thanks in advance
asked Aug 1, 2016 at 17:05
Dhruv MarwhaDhruv Marwha
1,0552 gold badges14 silver badges26 bronze badges
1
You’d better create a function to test if number is prime as @wim said.
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
This is a simple and efficient primality test.
Then you can simply sum with:
def sum_primes(l):
return sum(n for n in l if is_prime(n))
answered Aug 3, 2016 at 16:12
Carlos AfonsoCarlos Afonso
1,8991 gold badge11 silver badges22 bronze badges
2
The problem with your code is that you are using range
with float value.
What you really need here is integer division. In Python 3, that is the //
operator:
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
Also, you need to check if value is divisible by every number except 1 and itself. All numbers will be divisible by 1. So start the range from 2. Furthermore, it is numbers that are divisible that aren’t prime, so add an else clause to your for-loop which is only executed if your for-loop goes to completion without the breaking i.e. none of the numbers you checked divide value, thus value is prime!
answered Aug 1, 2016 at 17:20
Here is the solution for your queries
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]))
wogsland
8,97819 gold badges56 silver badges91 bronze badges
answered Feb 2, 2017 at 16:46
def sumprime(list):
sum =0
flag =1
for i in range(len(list)):
num = list[i]
for j in range(2, num):
if list[i]%j ==0:
flag = 0
break
else:
flag = 1
if num ==2:
flag =1
if flag ==1:
sum =sum +list[i]
return(sum)
list =[2,3,5,7]
print(sumprime(list))
answered Aug 22, 2018 at 11:22
0
def prime(n):
count = 0
if n > 1:
for i in range(1,n+1):
if n % i == 0:
count = count + 1
if count == 2:
return True
else:
return False
def sumprimes(l):
x = list(filter(prime,l))
y = sum(x)
return y
print(sumprimes([-3,3,1,13]))
answered Feb 14, 2019 at 13:20
1
Задача 10. Сложение простых чисел
Условие задачи
Сумма простых чисел меньше 10 — это 2 + 3 + 5 + 7 = 17.
Найдите сумму всех простых чисел меньше двух миллионов.
Решение
Мы уже использовали алгоритмы поиска простых чисел на python здесь и здесь. Но в этой задаче я хочу попробовать нечто новое — Решето Эратосфена . Это достаточно интересный и быстрый алгоритм, но я его не использовал в прошлых задачах т.к они не сильно подходили под условия — здесь же решето Эратосфена подходит практически идеально.
На заметку — недавно вычитал из статьи на Хабре, что один известный математик недавно оптимизировал решето Эратосфена. Речь идет о очень существенной экономии памяти — буквально с гигабайта к мегабайту. Если где-то опубликуют его алгоритм обязательно напишу об этом статью.
В данной программе я использовал 2 функции
eratosthen(n) — пропускаем через решето массив от 0 до числа n. Функция создает массив, а затем в цикле заполняем нулями числа согласно правил решета Эратосфена
sum — встроенная функция суммирования списков
Полный текст программы
def eratosthen(n):
sieve = list(range(n))
sieve[1] = 0
for i in sieve[2:]:
for j in range(i + i, len(sieve), i):
sieve[j] = 0
return sieve
print(sum(eratosthen(2000000)))
Задача решена
Популярные сообщения из этого блога
. Задача №1 Если выписать все натуральные числа меньше 10, кратные 3 или 5, то получим 3, 5, 6 и 9. Сумма этих чисел — 23. Найдите сумму всех чисел меньше 1000, кратных 3 или 5. Решение
Условие задачи Простые делители числа 13195 — это 5, 7, 13 и 29. Каков самый большой делитель числа 600851475143, являющийся простым числом? Решение Простым числом, является натуральное число больше единицы, которое имеет 2 делителя — 1 и само себя. Для начала найдем все простые делители необходимого числа. Чтобы сократить поиск будем перебирать до квадратного корня 600851475143 округленного вверх ( функцией math.ceil) Перебор будем вести начиная с числа 3. Если i делит число на цело, рекурсивно обращаемся к функции issimple c аргументом i. Функция issimple возвращает пустой список если число является простым. В этом случае число попадает в результирующий список Далее остается только вернуть максимальное значение массива простых чисел, которые нацело делят число 600851475143 Код Python import math def issimple(a): r=math.ceil(math.sqrt(a)) lst=[] for i in range(3,r): if a%i==0: if issimple(i)==[]: lst.app
Условие задачи 2520 — самое маленькое число, которое делится без остатка на все числа от 1 до 10. Какое самое маленькое число делится нацело на все числа от 1 до 20? Скажу сразу — не смотря на не большой диапазон чисел условия реализация этой задачи получилась громоздкой и ее выполнение занимает больше всего времени — около 90 с несмотря на все попытки оптимизации. Решение
Вот очень эффективная реализация решета Эратосфена (c) Robert William Hanks — я лишь добавил отладочную информацию:
def primes(n):
""" Returns a list of primes < n """
# (c) Robert William Hanks - https://stackoverflow.com/a/3035188/5741205
sieve = [True] * n
print("все чётные числа игнорируются и будут пропущены при возврате...n")
for i in range(3,int(n**0.5)+1,2):
if sieve[i]:
print('содержимое решета:t{}'.format([x for x in range(3,n,2) if sieve[x]]))
print(f'i:{i} вычёркиваем все числа кратные "{i}", начиная с "{i}^2": {list(range(i*i, n, 2*i))}')
sieve[i*i::2*i]=[False]*((n-i*i-1)//(2*i)+1)
print(f'sieve[{i}*{i}::2*{i}]=[False]*(({n-i}*{i-1})//(2*{i})+1)')
print('содержимое решета:t{}'.format([x for x in range(3,n,2) if sieve[x]]))
print('*' * 60)
return [2] + [i for i in range(3,n,2) if sieve[i]]
Вывод для n=50
:
In [165]: primes(50)
все чётные числа игнорируются и будут пропущены при возврате...
содержимое решета: [3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49]
i:3 вычёркиваем все числа кратные "3", начиная с "3^2": [9, 15, 21, 27, 33, 39, 45]
sieve[3*3::2*3]=[False]*((47*2)//(2*3)+1)
содержимое решета: [3, 5, 7, 11, 13, 17, 19, 23, 25, 29, 31, 35, 37, 41, 43, 47, 49]
************************************************************
содержимое решета: [3, 5, 7, 11, 13, 17, 19, 23, 25, 29, 31, 35, 37, 41, 43, 47, 49]
i:5 вычёркиваем все числа кратные "5", начиная с "5^2": [25, 35, 45]
sieve[5*5::2*5]=[False]*((45*4)//(2*5)+1)
содержимое решета: [3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 49]
************************************************************
содержимое решета: [3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 49]
i:7 вычёркиваем все числа кратные "7", начиная с "7^2": [49]
sieve[7*7::2*7]=[False]*((43*6)//(2*7)+1)
содержимое решета: [3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
************************************************************
Out[165]: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47
|
Найти сумму простых чисел на Python
|
17/03/17 |
Всем привет. Нужно решить задачу. Для решения я использую метод решета Эратосфена(код внизу). a=2000001 Этот скрипт не плохо работает для чисел меньших
|
|
|
venco |
Re: Найти сумму простых чисел на Python
|
||
04/05/09 |
Решето Эратосфена работает хорошо, если использовать не список чисел, как у вас, а массив флагов простое/составное, по одному флагу на каждое число. Даже в википедии есть достаточно разумный псевдо-код, используйте его.
|
||
|
|||
guitar15 |
Re: Найти сумму простых чисел на Python
|
17/03/17 |
То есть нужно использовать NumPy ?
|
|
|
venco |
Re: Найти сумму простых чисел на Python
|
||
04/05/09 |
Зачем? Нужен одномерный массив, надеюсь, такие есть в питоне.
|
||
|
|||
guitar15 |
Re: Найти сумму простых чисел на Python
|
17/03/17 |
нет — 11.07.2017, 18:18 — Я не знаю, как создать массив (в python отсутствуют массивы. Вместо них для хранения однородных (и не только) объектов используются списки. )
|
|
|
Pphantom |
Re: Найти сумму простых чисел на Python
|
||
09/05/12 |
То есть нужно использовать NumPy? В общем-то да. Или не Python, если это допустимо.
|
||
|
|||
mihaild |
Re: Найти сумму простых чисел на Python
|
||
16/07/14 |
в python отсутствуют массивы. Вместо них для хранения однородных (и не только) объектов используются списки То, что в питоне называется list — и есть массив (в динамически типизированных языках).
|
||
|
|||
Aritaborian |
Re: Найти сумму простых чисел на Python
|
11/06/12 |
guitar15 , позвольте полюбопытствовать, задачу нашли на Project Euler ?
|
|
|
guitar15 |
Re: Найти сумму простых чисел на Python
|
17/03/17 |
|
|
|
guitar15 |
Re: Найти сумму простых чисел на Python
|
17/03/17 |
Думаю, что для нахождения простых чисел можно использовать Решето Эратосфена с линейным временем работы. К сожалению, я не могу понять как использовать этот метод.
|
|
|
Dmitriy40 |
Re: Найти сумму простых чисел на Python
|
||
20/08/14 |
Для чисел до 2 миллионов можно не связываться с решетом (раз уж не понимаете его), сделать проверку каждого нечётного числа на простоту делением на все простые до корня из проверяемого числа. При нахождении нового простого числа добавлять его в список проверочных (если его квадрат меньше 2 миллионов) и добавлять его к сумме. Всё. Понадобится не более 223 миллионов делений (даже заметно меньше), это пара секунд, остальные операции ещё быстрее (проход списка подряд вперёд не медленнее прямого обращения в массив).
|
||
|
|||
guitar15 |
Re: Найти сумму простых чисел на Python
|
17/03/17 |
У меня получился такой код (если я вас правильно понял), но время работы составляет 4 минуты. s=[]
|
|
|
mihaild |
Re: Найти сумму простых чисел на Python
|
||
16/07/14 |
guitar15 , попробуйте перебирать не все k, а только уже найденные простые. Еще полученный код может неправильно работать для точных квадратов (вещественный корень может оказаться чуть меньше правильного значения). Ну и вместо сложной логики «на каждой итерации ищем следующее простое» можно сделать гораздо проще «проверяем, является ли текущее число простым» (т.е. n внутри цикла по k не менять — и вообще по нему сделать for n in range(2, 2*10^6)).
|
||
|
|||
Dmitriy40 |
Re: Найти сумму простых чисел на Python
|
||
20/08/14 |
Нет необходимости вычислять корень для каждого прохода цикла по k, достаточно запустить цикл прохода по всему накопленному массиву s, ведь там именно нужные числа и есть. А вот добавлять туда числа не все найденные, а лишь если их квадрат меньше 2 миллионов. У Вас основные тормоза в операции извлечения корня. Плюс проход по k должен идти не по всем числам подряд, а лишь по числам из списка s, это вшестеро ускорит программу.
|
||
|
|||
Dmitriy40 |
Re: Найти сумму простых чисел на Python
|
||
20/08/14 |
Аналог Вашего кода на дельфи (паскале) выполняется 1.5 секунды (причём сумма неправильная!), после предложенных модификаций время 0.18 секунды, ускорение больше 8-ми раз, значит можно ожидать времени в полминуты на питоне. Решето Эратосфена без всяких оптимизаций выполняется за 0.06 секунды, ещё втрое быстрее. Ну и «скорость» питона видно. — 12.07.2017, 18:39 — Ещё пара цифр, для чисел до 20 миллионов время выполнения программы (Ваша : оптимизированная : решето): 33с : 3.1с : 0.42с.
|
||
|
|||
Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы
0 / 0 / 0 Регистрация: 06.12.2018 Сообщений: 34 |
|
1 |
|
Найти сумму простых чисел в списке10.12.2018, 21:20. Показов 7654. Ответов 4
Дан список состоящий из чисел.Найти сумму простых чисел в списке.
0 |
1303 / 843 / 409 Регистрация: 12.03.2018 Сообщений: 2,305 |
|
11.12.2018, 09:02 |
2 |
Пишите функцию проверки числа на простоту, которая вернет логическое значение (ищите на форуме).
0 |
Viktorrus 1728 / 967 / 199 Регистрация: 22.02.2018 Сообщений: 2,694 Записей в блоге: 6 |
||||
11.12.2018, 15:11 |
3 |
|||
Учел рекомендации ioprst, что бы код был компактнее:
здесь простые числа 71, 5, 11
0 |
0 / 0 / 0 Регистрация: 06.12.2018 Сообщений: 34 |
|
13.12.2018, 20:25 [ТС] |
4 |
Спасибо большое
0 |
4607 / 2028 / 359 Регистрация: 17.03.2012 Сообщений: 10,086 Записей в блоге: 6 |
|
14.12.2018, 11:31 |
5 |
Так будет зело медленно, найденные простые числа надо кешировать.
0 |