Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 7, 2010 10:09:44

guranvir
От:
Зарегистрирован: 2010-03-16
Сообщения: 186
Репутация: +  0  -
Профиль   Отправить e-mail  

Решето Эратосфена

Ребят вот написал функцию, реализующую данный алгоритм:

#решето Эратосфена
def Eratos(resheto,n):
j=0
p=resheto[j]
while n>p**2:
for i in resheto:
if i>2*p and i%p== 0:
resheto.remove(i)
j+=1
p=resheto[j]
return resheto
n=input('Input high number:')
resheto=[i for i in range(2,n) ]
resheto=Eratos(resheto,n)
print resheto
Если можно посмотрите и попинайте, при чем последнее решительно приветствуется :)
З.Ы. Один недостаток я вижу, она бежит в каждом for по всему списку же, интересно можно ли заставить for бежать не с самого начала, а начиная с i-отго элемента. Потому что сама проблема вот в чем: например переменная p принимает значение 2, исключаются все элементы кратные двум, потом 3й-ке. При этом когда будет бежать по списку, то 2-йка то же будет взята в обработку, а все элементы, находящиеся до i-ого элемента нужно исключить из рассмотрения.
Пример:

Проверяем на кратность 3-ке, элемент с индексом ноль можно сразу проскочить.



Отредактировано (Окт. 7, 2010 10:16:27)

Офлайн

#2 Окт. 7, 2010 11:12:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Решето Эратосфена

>>> n = 2
>>> for i in range(3):
... for j in list(range(20))[n ** 2:]:
... print(j, end=' ')
... n += 1
... else:
... print()
...
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 9 10 11 12 13 14 15 16 17 18 19 16 17 18 19
>>>



Отредактировано (Окт. 7, 2010 11:14:15)

Офлайн

#3 Окт. 7, 2010 13:06:02

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Решето Эратосфена

guranvir
Если можно посмотрите и попинайте, при чем последнее решительно приветствуется :)
Попинать мы всегда готовы :)
1. непонятен смысл передачи списка в вашу функцию. По-моему достаточно передать n, а список генерить внутри.
2. вместо всех этих j=0 p = resheto j+=1 напрашивается цикл for
3. то, что вы заметили - нужно исключить проход по уже обработаным элементам.



Офлайн

#4 Окт. 7, 2010 14:18:46

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Решето Эратосфена

и вновь начинается поиск максимального простого числа :) где то я уже встречал использование такой штуки :) к примеру перемножения 2х простых чисел :)

Офлайн

#5 Окт. 7, 2010 17:47:02

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Решето Эратосфена

sypper-pit
и вновь начинается поиск максимального простого числа
а разве решето - это не массив простых делителей? или уже слишком поздно и мне пора спать? :)



Офлайн

#6 Окт. 7, 2010 19:27:05

guranvir
От:
Зарегистрирован: 2010-03-16
Сообщения: 186
Репутация: +  0  -
Профиль   Отправить e-mail  

Решето Эратосфена

Ну решето это массив простых чисел:)



Офлайн

#7 Окт. 7, 2010 19:33:05

guranvir
От:
Зарегистрирован: 2010-03-16
Сообщения: 186
Репутация: +  0  -
Профиль   Отправить e-mail  

Решето Эратосфена

Спасибо за критику )



Офлайн

#8 Окт. 8, 2010 02:17:39

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Решето Эратосфена

guranvir
Ну решето это массив простых чисел
да, ночью сюда лучше не заходить :)
попробуйте поиск по форуму, здесь как-то обсуждалось нечто подобное, что-то связанное с задачами с эйлера



Офлайн

#9 Окт. 10, 2010 11:53:10

guranvir
От:
Зарегистрирован: 2010-03-16
Сообщения: 186
Репутация: +  0  -
Профиль   Отправить e-mail  

Решето Эратосфена

#решето Эратосфена
def Eratos(n):
resheto=[i for i in range(2,n) ]
print resheto
for j in xrange(0,len(resheto)):
p=resheto[j]
if p**2>n:
break
i=j+1
while i<len(resheto):
print resheto
print i
if resheto[i]%p==0:
resheto.remove(resheto[i])
i=i+1
return resheto
#/////////////////////////////////////////////////////////////
n=input('Input high number:')
resheto=Eratos(n)
print resheto
Итак проход по уже пройденным исключил, список генерим внутри функции.
Насчет пункта 2 о цикле for и range. Я так понимаю что Ed именно такую комбинацию для устранения цикла while. Но в ходе реализации его предложения была замечена деталь которая заставила вернутся к while:
когда мы используем range или xrange они генерируют список/итератор лишь один раз, исходя из длины списка до каких либо изменений. В дальнейшем никаких пересчетов и изменений в списке от range естественно не происходит. В результате нам приветливо машет ручкой ошибка index out of range. Если же мы используем while то перед каждым увлечением индекса выполняется проверка на не выход за границы. Можно конечно внутрь for запихнуть либо обработчик соотв исключения, либо простой if с доп проверкой на выход, но while получается проще для этого.
Но может быть я что то понимаю не так как надо :)



Отредактировано (Окт. 10, 2010 11:54:14)

Офлайн

#10 Окт. 10, 2010 21:12:30

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Решето Эратосфена

1. resheto= выглядит странно. range(2, n) чем не устраивает? Если заботитесь о том, чтобы это работало в 3м питоне, то хотя бы list(range(2,n))
2. зачем в вызове xrange 0? Он и так с нуля считает.
3. i=j+1, while i<len(resheto):, i=i+1 можно заменить на for num in resheto
4. Почитайте PEP08 http://www.python.org/dev/peps/pep-0008/ и следуйте ему. Особо бросаются в глаза слепленые операторы и операнды. Если разделить их пробелами будет намного читабельнее. Например: 'p = resheto' читается гораздо лучше, чем 'p=resheto'
5. Я надеюсь, что print-ы внутри функции - это отладка. Если нет, то это плохо.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version