Ошибки генератора списка простых чисел Python - PullRequest
0 голосов
/ 19 февраля 2019

Этот код начинается с 5 и перечисляет следующие простые числа по вашему выбору, которые в данном случае являются следующими 17 простыми числами.Когда я запускаю его, 25 и 49 печатаются.Почему они не отфильтрованы?

start = 5
number = 1
divisor = 3
upper = start - 2
doc = open("hey.txt", "w")
while number <= 17:
    if start % divisor == 0:
        start = start + 2
        divisor = 3
    elif divisor == upper:
        doc.write(str(start))
        doc.write(", ")
        number = number + 1
        start = start + 2
        divisor = 3
    else:
        divisor = divisor + 2


hey.txt: 5, 7, 11, 13, 17, 19, 23, 25, 29, 31, 35, 37, 41, 43, 47, 49, 53, 

Ответы [ 4 ]

0 голосов
/ 19 февраля 2019

Чистее и короче:

lower = 5
upper = 50

print("Prime numbers between {} and {} are: ".format(lower, upper))

doc = open("hey.txt", "w")
for num in range(lower,upper + 1):
   # prime numbers are greater than 1
   if num > 1:
       for i in range(2,num):
           if (num % i) == 0:
               break
       else:
           print(num)
           doc.write(str(num))
           doc.write(",")

ВЫХОД:

Prime numbers between 5 and 50 are: 
5,7,11,13,17,19,23,29,31,37,41,43,47,
0 голосов
/ 19 февраля 2019

Вы уже получили ответ на свой вопрос.Но взгляните на этот вопрос.Это гораздо более быстрый подход к выполнению простых чисел Быстрые простые числа с python :

def primes2(n):
    """ Input n>=6, Returns a list of primes, 2 <= p < n """
    n, correction = n-n%6+6, 2-(n%6>1)
    sieve = [True] * (n//3)
    for i in range(1,int(n**0.5)//3+1):
      if sieve[i]:
        k=3*i+1|1
        sieve[      k*k//3      ::2*k] = [False] * ((n//6-k*k//6-1)//k+1)
        sieve[k*(k-2*(i&1)+4)//3::2*k] = [False] * ((n//6-k*(k-2*(i&1)+4)//6-1)//k+1)
    return [2,3] + [3*i+1|1 for i in range(1,n//3-correction) if sieve[i]]

Правда, на самом деле он не читается.Но сначала посмотрите, не сделали ли другие люди то, что вы пытаетесь сделать.Python - это язык с огромным сообществом, и его преимущества - это тонна библиотек и тонна разработанных алгоритмов / программ, которые, вероятно, выполняют то, что вы хотите, и делают это чище и быстрее, чем вы сами.Так что наслаждайтесь пользой сообщества.)

0 голосов
/ 19 февраля 2019

вам нужно обновить переменную upper, я объясню:

когда вы записываете в файл свой номер start, это означает, что вы нашли это число простым числом, следовательно, вынеобходимо обновить переменную upper, чтобы она стала новым значением start -2, поскольку вы увеличили start.поэтому ваша функция должна выглядеть так:

start = 5
number = 1
divisor = 3
upper = start - 2
doc = open("hey.txt", "w")
while number <= 17:
    if start % divisor == 0:
        start = start + 2
        divisor = 3
    elif divisor == upper:
        doc.write(str(start))
        doc.write(", ")
        number = number + 1
        start = start + 2
        divisor = 3
        upper = start - 2 # this is the line you forgot.
    else:
        divisor = divisor + 2
0 голосов
/ 19 февраля 2019

Вероятно, потому что вы не увеличиваете верх.Таким образом, максимальный делитель, который вы тестируете, равен 3.

...