#python #for-loop #if-statement
Вопрос:
x=11
for n in range(1,x 1):
#print(n)
if (x%n)==0:
if n == 1 and n==x:
print(f"{x} is a prime number")
break
else:
#print(n)
print(f"{x} is not a prime number")
break
вывод: 11 не является простым числом.
Насколько мне известно, логика верна, но почему этот неправильный вывод.
Комментарии:
1.
n == 1 and n==x
это условие никогда не вернет значение true. Потому что, если n равно 1, оно не может быть равноx
11.2. Казалось бы, в этом и заключается проблема:
n == 1 and n==x
. Это может быть верно только тогда, когдаx == 1
3. Изменить «и» на «или», чтобы исправить. (кроме того, это неэффективный способ проверки на примитивность).
Ответ №1:
Алгоритм, который вы пытаетесь реализовать для принятия решения в x
is prime, выглядит следующим образом:
Учитывая целое число x
в качестве входных данных, выполните цикл по всем целым числам, n
, между 1
и x
. Если мы найдем n
, которое x
точно делится, и если это n
не 1
или x
, то выведем, что x
это не простое число. В противном случае выведите x
простое число.
Учитывая это описание, вы можете увидеть, где ваш Python идет не так. В описанном алгоритме мы не можем определить, является ли x
он простым, пока не перепробуем все n
и не решим , что они не делятся x
, если n == 1
только или n == x
. Но в вашем примере кода ваш тест на примитивность (который, кстати, неверен) выполняется до того, как мы закончим цикл над всеми n
.
Вместо этого алгоритм говорит, что мы должны n
сначала попробовать все, проверив x
, не является ли оно простым, и если мы не можем найти то, которое показывает x
, что оно не простое, то x
, очевидно, оно простое. Так вот что мы будем делать на Python…
Из описания мы можем написать тест на то, не является ли число простым числом:
x % n == 0 and n != 1 and n != x
Если что-либо n
дает True
для этого условия, то x
не является простым. Мы можем сделать это для каждого n
и прекратить цикл , когда мы его найдем:
for n in range(1,x 1):
if x % n == 0 and n != 1 and n != x:
print(f"{x} is not a prime number")
break
Теперь, если мы доберемся до конца цикла без break
ing, тогда мы знаем x
, что это просто. Как мы узнаем, когда закончили цикл? Один из вариантов-использовать переменную флага вместо того, чтобы сразу печатать вывод. Например.
isprime = True
for n in range(1,x 1):
if x % n == 0 and n != 1 and n != x:
isprime = False
break
if isprime:
print(f"{x} is a prime number")
else:
print(f"{x} is not a prime number")
Это сработает для вас. Это не самый эффективный алгоритм для тестирования на примитивность, но он прост и работает.
ПРИМЕЧАНИЕ: В качестве быстрого первого шага вам не нужны n == 1
n == x
тесты и, если вы просто выполняете цикл от n=2
до n=x-1
. Например.
isprime = True
for n in range(2, x):
if x % n == 0:
isprime = False
break
Комментарии:
1. @aneroid Мне действительно так нравится! Но если вы сочтете это странным, другие, скорее всего, тоже, так что отредактируйте