Найти - Пользователи
Полная версия: Решето Эратосфена
Начало » Python для новичков » Решето Эратосфена
1 2
guranvir
Ребят вот написал функцию, реализующую данный алгоритм:
#решето Эратосфена
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-ке, элемент с индексом ноль можно сразу проскочить.
py.user.next
>>> 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
>>>
Ed
guranvir
Если можно посмотрите и попинайте, при чем последнее решительно приветствуется :)
Попинать мы всегда готовы :)
1. непонятен смысл передачи списка в вашу функцию. По-моему достаточно передать n, а список генерить внутри.
2. вместо всех этих j=0 p = resheto j+=1 напрашивается цикл for
3. то, что вы заметили - нужно исключить проход по уже обработаным элементам.
sypper-pit
и вновь начинается поиск максимального простого числа :) где то я уже встречал использование такой штуки :) к примеру перемножения 2х простых чисел :)
pyuser
sypper-pit
и вновь начинается поиск максимального простого числа
а разве решето - это не массив простых делителей? или уже слишком поздно и мне пора спать? :)
guranvir
Ну решето это массив простых чисел:)
guranvir
Спасибо за критику )
pyuser
guranvir
Ну решето это массив простых чисел
да, ночью сюда лучше не заходить :)
попробуйте поиск по форуму, здесь как-то обсуждалось нечто подобное, что-то связанное с задачами с эйлера
guranvir
#решето Эратосфена
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 получается проще для этого.
Но может быть я что то понимаю не так как надо :)
Ed
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-ы внутри функции - это отладка. Если нет, то это плохо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB