2009-12-09 3 views
0
x = y // 2 # For some y > 1 
while x > 1: 
    if y % x == 0: # Remainder 
     print(y, 'has factor', x) 
     break # Skip else 
    x -= 1 
else: # Normal exit 
    print(y, 'is prime') 

Это пример понимания цикла while в книге, которую я читаю, я не совсем понимаю, почему разделение пола, а затем y% x? Может кто-нибудь объяснить этот фрагмент кода, что он делает?Пока пример цикла

Спасибо!

+0

Замечание для редакторов, предложение else должно быть встроено в оператор while, а не оператор if. – Wogan

+0

Исправлено это для вас. – Ikke

+2

этот код не Python, это C :-) –

ответ

1

программа печатает по меньшей мере, один фактор целого числа у, или если он не имеет факторов (кроме себя и 1), отпечатки, что у первична ,

Он использует переменную x, чтобы попробовать все возможные факторы, превышающие один. Он начинается на полу y, разделенном на 2, потому что число, большее половины y, может быть фактором. Использование нормального деления, а не разделения пола может дать вам дробное значение, если y нечетно. (Еще лучшее решение - начать с квадратного корня y - если y не является простым, один из его факторов будет меньше или равен его квадратному корню.)

Внутри цикла он проверяет y% x , что является остатком после деления y на x. Если остаток равен нулю, это означает, что x является фактором y, и он печатает его.

Предложение else выполняется в конце цикла, если только не найден фактор, и в этом случае «break» пропускается из цикла и предложения else. Таким образом, либо найден фактор, либо он является простым.

Вот усовершенствованный код с отступом фиксированным:

import math 

def check_primality(y): 
    x = int(math.sqrt(y)) 
    while x > 1: 
    if y % x == 0:             
     print y, 'has factor', x 
     break 
    x -= 1 
    else: 
    print y, 'is prime' 
+0

Вопрос задан в Python 3000. Возможно, вы захотите отметить, что ваш код не будет работать под 2. *. – Patrick

+0

работает под номером 2.6 – wds

+0

Убрать нет. Устранить отсутствие редактирования комментариев. – Patrick

4

Это хромой primality test.

% is mod operator. Он выполняет деление и возвращает остаток, а не результат деления. Так, например, 5 // 2 == 2, и 5% 2 == 1.

Комментарии:

x = y // 2 # For some y > 1 ##Reduce search space to half of y 
while x > 1: 
    if y % x == 0: # Remainder ##If x divides y cleanly (4/2 == 2) 
    print(y, 'has factor', x) ##y is not prime 
    break # Skip else  ##Exit the loop 
    x -= 1 # Normal exit ##Try the next value 
else: 
    print(y, 'is prime') 
+0

Этот ответ не очень полезен, потому что код неверен: он печатает, что y является простым, даже если это не так. – dmazzoni

+0

x - = 1 else: // СинтаксисError: недействительный синтаксис , и если вы хотите оптимизировать, вы можете изменить, когда x> 1 в s = sqrt (y), а x> s –

+0

dmazzoni: другое было не так место. Это было исправлено. – Patrick

1

логика:

, если у по модулю х равен 0, то это означает, что х является делителем у, поэтому у имеет множитель. распечатать это и выйти из цикла.

если нет, уменьшите x на 1 и повторите попытку.

но некоторые вещи ломаются в этом коде:

  1. другое заявление позиции
  2. тот факт, «печать у первична» после цикла - он всегда будет печатать.
0

Я думаю, что программа пытается найти самые большие простые множители y. Если y является основным фактором, он также печатает это.

0

x = y // 2 предназначен для испытания чисел в диапазоне x: 2..y/2.
Лучший подход будет проверить только числа х: 2..sqrt(y)

1

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

0

% обозначает модуль, который дает вам остаток от деления ...

и этот код проверки для простого Y, а также проверяет, если Y является мультипликатором х ...

х = у // 2 # х = деление или модуль у, 2

а х> 1: # Вы хотите, чтобы проверить, является ли это результатом разделение или модуль

если у% х == 0 # если y является множителем x

print(y, 'has factor', x) 

    break # break the while loop 

x -= 1 # decreament x 

еще: # эта строка выполняется, если wihle достиг й> 1 и вратарь перерыва печати (у, «простое»)

так что если у есть множитель х он decreament х и цикла continue в противном случае он будет печатать y является простым

1

Для любого числа (x), которое не является простым, будет коэффициент больше 1 и меньше (x/2). 9 = 3 * 3 Логика состоит в том, чтобы перебирать все числа < = x/2 и проверять, делит ли число.