Я собираюсь выполнить функцию, цель которой - вернуть оператор Prime/Not prime, если его аргумент является или не является простым числом. Мне удалось использовать цикл for:
def prime1(n):
z = []
for i in range (1, n+1):
if (n/i).is_integer():
z.append(i)
i=i+1
if len(z) == 2:
print ("Prime")
else:
print ("Not prime")'
Затем я попытался сделать то же самое, но используя цикл while:
def prime2(n):
z = []
i = 1
while i < int(len(range(1, n+1))):
if (n/i).is_integer():
z.append(i)
i=i+1
if len(z) == 2:
print ("Prime")
else:
print ("Not prime")
К сожалению, моя система продолжает вычислять, не печатая мне результат.
Можете ли вы объяснить мне, где я совершил ошибку?
i = я + 1
ничего не делает в вашем цикле for
, так как значение i
перезаписывается следующим значением итератора; эффективно цикл for
выполняет i = я + 1
для вас на каждой итерации независимо от того, делят ли i
n
. Вы должны сделать то же самое в вашем в while
цикла:
while i < n + 1:
if (n/i).is_integer():
z.append(i)
i = i + 1
Самый пифонический способ, о котором я мог думать, ниже:
def isPrime(n):
return all(n % i for i in range(2, int(n ** 0.5) + 1)) and n > 1
for i in range(1, 20):
print(isPrime(i))
Объяснение:
все убеждаются, что каждый элемент в данном выражении возвращает True
n% я возвращает True
если n! = 0 (допускаются даже отрицательные числа)
int(n ** 0.5)
эквивалентно sqrt(n)
и поскольку range
всегда возвращает числа до n - 1, вы должны добавить 1
n > 1
гарантирует, что n
не 1
Проблема в вашем коде заключается в том, что ваш i = я + 1
в неправильной области
Ваша программа проверяет, является ли (n/i).is_integer()
которая возвращает False
поскольку n/2 не является целым числом
Улучшение кода:
Вместо (n/i).is_integer()
вы можете использовать n % я == 0
, который возвращает остаток равным 0
Затем вы должны поместить i = я + 1
во внешнюю область
И лично я никогда не был поклонником i = я + 1
. Использовать i += 1
Я думаю, что лучший способ - использовать код, показанный выше.
Надеюсь это поможет!
Редактировать:
Вы можете напечатать "Prime" или "Not Prime" следующим образом:
def isPrime(n):
print('Prime' if all(n % i for i in range(2, int(n ** 0.5) + 1))
and n > 1 else 'Not Prime')
for i in range(1, 20):
isPrime(i)
Наш предпочтительный метод не должен быть в while
циклы, если нам не нужно их использовать, что, как говорится, мы могли бы использовать списки:
def prime(n):
z = []
[z.append(i) for i in range(1, n+1) if (n/i).is_integer()]
[print("Prime") if len(z) == 2 else print("Not Prime")]
prime(101)
Но давайте возьмем петлю в том, что вы получили for
цикла for
:
for i in range (1, n+1):
if (n/i).is_integer():
z.append(i)
i=i+1
Строка i = я +
не служит цели, которую вы намереваетесь, цикл будет повторяться от 1 to n+1
независимо от того, что
Теперь в while
цикл:
while i < int(len(range(1, n+1))):
if (n/i).is_integer():
z.append(i)
# i=i+1 does not go inside if statement
i += 1
Теперь вам нужно увеличивать i
но если это приращение происходит только тогда, когда выполняются условия if
, то if
условие if
не выполняется, вы будете застревать при том же i
в нем. Также попробуйте использовать i += 1
означает то же самое
Вы увеличиваете итерируемую переменную i
внутри оператора if, поэтому переменная никогда не увеличивается, зацикливаясь на бесконечном цикле.
Когда вы использовали for
него, это работало, потому что итеративный изменяется после каждой полной итерации блока.
Перемещение инкремента i
одного блока идентификации влево (внутри while
а не for
) будет работать отлично
Код, адаптированный из https://www.programiz.com/python-programming/examples/prime-number
Вам не нужно проверять до num, и вы можете идти 2 на 2, если у вас нет базы данных простых чисел
import math
#num = 437
if num > 1:
# check for factors
for i in range(2, int(math.ceil(math.sqrt(num))), 2):
if (num % i) == 0:
print(num, "is not a prime number")
print(i, "times", num // i, "is", num)
break
else:
print(num, "is a prime number")
# if input number is less than
# or equal to 1, it is not prime
else:
print(num, "is not a prime number")
if (n/i).is_integer():
если это неif (n/i).is_integer():
вы никогда не увеличивалиi
поэтому вы застряли в бесконечном цикле