Какой самый питонный способ написания функции простого числа с использованием цикла for и while?

1

Я собираюсь выполнить функцию, цель которой - вернуть оператор 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")

К сожалению, моя система продолжает вычислять, не печатая мне результат.

Можете ли вы объяснить мне, где я совершил ошибку?

  • 0
    if (n/i).is_integer(): если это не if (n/i).is_integer(): вы никогда не увеличивали i поэтому вы застряли в бесконечном цикле
  • 0
    Дубликат stackoverflow.com/questions/4114167/…
Показать ещё 1 комментарий
Теги:
for-loop
while-loop
primes

5 ответов

2
Лучший ответ

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
0

Самый пифонический способ, о котором я мог думать, ниже:

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)
0

Наш предпочтительный метод не должен быть в 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 означает то же самое

0

Вы увеличиваете итерируемую переменную i внутри оператора if, поэтому переменная никогда не увеличивается, зацикливаясь на бесконечном цикле.

Когда вы использовали for него, это работало, потому что итеративный изменяется после каждой полной итерации блока.

Перемещение инкремента i одного блока идентификации влево (внутри while а не for) будет работать отлично

0

Код, адаптированный из 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")

Ещё вопросы

Сообщество Overcoder
Наверх
Меню