Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 24, 2013 11:10:41

r2d2
Зарегистрирован: 2013-05-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывод списка простых чисел в заданном диапазоне.

Подскажите почему не работает вывод списка простых чисел в заданном диапазоне? Выдаётся тупо список всех чисел из диапазона.

def simple (n):
    div=0
    for i in xrange (2, n+1):
        for j in xrange (2, i):
            if i % j == 0:
                div += 1
        if div == 0: 
            return True
        else: 
            return False
n=input()
l = [ i for i in xrange(n) if simple(i) ]
print l

Офлайн

#2 Июнь 24, 2013 11:23:08

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Вывод списка простых чисел в заданном диапазоне.

неправильная вложенность

Офлайн

#3 Июнь 25, 2013 09:39:52

empirik
Зарегистрирован: 2012-03-26
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывод списка простых чисел в заданном диапазоне.

А зачем создавать функцию, если ты потом используешь генератор?
http://habrahabr.ru/post/122538/ - вот тут первый вариант - как раз то, что тебе нужно, судя по всему.
Только еще один момент: а есть ли смысл бегать во втором цикле до самого числа, может быть, хватит и его половины. Само собой, оно может и не делиться на 2 нацело, просто с отбросом дробной части и прибавлением 1.

Офлайн

#4 Июнь 26, 2013 21:36:53

r2d2
Зарегистрирован: 2013-05-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывод списка простых чисел в заданном диапазоне.

Я вот нашёл еще нечто похожее. Это генератор простых чисел. Но по ходу не работает. В чём здесь ошибка, не подскажите?

def endless_prime_generator():
    used_primes = []
    current_n = 2
    while True:
        is_prime = True
        for p in used_primes:
            if current_n % p == 0:
                is_prime = False
                break
            if is_prime:
                used_primes.append(current_n)
                yield current_n
                current_n += 1
primes = endless_prime_generator()
print "Iterating endless prime generator"
for i in range(10):
    print primes.next(),

Должен как бы выводить:
Iterating endless prime generator
2 3 5 7 11 13 17 19 23 29

Офлайн

#5 Июнь 27, 2013 15:17:36

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Вывод списка простых чисел в заданном диапазоне.

r2d2
Подскажите почему не работает вывод списка простых чисел в заданном диапазоне? Выдаётся тупо список всех чисел из диапазона.

неправильная вложенность

def simple (n):
    div=0
    for j in xrange (2, n):
        if n % j == 0:
           div += 1
    if div == 0: 
       return True
    else: 
       return False
n=input()
l = [ x for x in xrange(1, n+1) if simple(x) ]
print l

http://habrahabr.ru/post/122538/
клёвая статья :)



Отредактировано Budulianin (Июнь 27, 2013 15:28:50)

Офлайн

#6 Июнь 27, 2013 19:49:55

r2d2
Зарегистрирован: 2013-05-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывод списка простых чисел в заданном диапазоне.

Вот моя последняя версия. Помогите плз довести до ума. Выводится пока только: 2,3,2,2,2,2,2

def simple():
    lst=[]
    i = 2 
    while True:
        for p in lst:
            for i in xrange(2, p):
                if i % p == 0:
                    break
        else:
            lst.append(i)
            yield i
            i += 1 
gen=simple()
for j in range(7):
    print gen.next(),

Офлайн

#7 Июнь 27, 2013 21:56:07

elisk
Зарегистрирован: 2013-04-09
Сообщения: 35
Репутация: +  7  -
Профиль   Отправить e-mail  

Вывод списка простых чисел в заданном диапазоне.

http://py-algorithm.blogspot.ru/2011/04/blog-post_09.html
Только там примеры для Python2. Для Python3 переделать не составит труда, например со множеством:

import math
def primes(N):
  """Возвращает все простые от 2 до N"""
  sieve = set(range(2, N))
  for i in range(2, int(math.sqrt(N))):
    if i in sieve:
      sieve -= set(range(2*i, N, i))
  return sieve
  
print (primes(158))

или такой:

def good_prime(C):
    D=int(C/2)
    B=int(C/6)
    A=set(range(D))
    for i in range(1,B+1):
        for j in range(i,int((D+i)/(1+2*i)+1)):
            A.discard(i+j+2*i*j)
    A=[ 2*x+1 for x in A ]
    return A
    
print(good_prime(158))

Отредактировано elisk (Июнь 27, 2013 22:11:34)

Офлайн

#8 Июнь 27, 2013 22:14:44

r2d2
Зарегистрирован: 2013-05-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывод списка простых чисел в заданном диапазоне.

Ну да, там тоже вот недавно смотрел, но я пытаюсь сделать именно в виде генератора как в предыдущем посте.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version