Этот код начинается с 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,
Является ли намерение печатать только простые числа?
Если ваши намерения - это генерация простых чисел - посмотрите на Сито_Эратосфена






Наверное, потому что вы не увеличиваете верхний. Таким образом, максимальный делитель, который вы проверяете, равен 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,
похоже, вы отфильтровываете только числа, кратные 2 или 3, например. у вас также есть 35 = 5 * 7. С большим количеством чисел вы получите еще больше кратных другим большим простым числам.