Ошибки генератора списка простых чисел Python

Этот код начинается с 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, 

похоже, вы отфильтровываете только числа, кратные 2 или 3, например. у вас также есть 35 = 5 * 7. С большим количеством чисел вы получите еще больше кратных другим большим простым числам.

buran 19.02.2019 10:27

Является ли намерение печатать только простые числа?

DirtyBit 19.02.2019 10:28

Если ваши намерения - это генерация простых чисел - посмотрите на Сито_Эратосфена

Alex Yu 19.02.2019 10:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
68
4

Ответы 4

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

Вы уже получили ответ на свой вопрос. Но взгляните на этот вопрос. Это более быстрый подход к простым числам Быстрые простые числа с 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 — это язык с огромным сообществом, а его преимущества — множество библиотек и множество разработанных алгоритмов/программ, которые, вероятно, делают то, что вы хотите, чище и быстрее, чем вы сделаете это самостоятельно. Так что наслаждайтесь пользой сообщества.)

вам нужно обновить переменную 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

Чище и короче:

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,

Другие вопросы по теме