синтаксис оператора if. Неверный вывод

#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 Мне действительно так нравится! Но если вы сочтете это странным, другие, скорее всего, тоже, так что отредактируйте