Как закончить цикл while, чтобы получить наибольший общий фактор - PullRequest
0 голосов
/ 29 мая 2018
a = 8
b = 6
gcf = 999
while a % gcf != 0 and b % gcf != 0:
    gcf -= 1
print(gcf)

Я пытаюсь получить наибольший общий множитель из двух чисел.Я получил 8 и 6 в качестве примера.Когда я запускаю код, он дает 8 вместо 2, что я ожидаю.Я, хотя, поскольку у меня есть and в цикле while, он завершит цикл, предоставив мне результат, который удовлетворяет обоим операторам.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Во-первых, чтобы ускорить поиск gcf, вы должны начать с минимумов a и b, поскольку gcf не будет больше, чем любой из них.Кроме того, вам нужно заменить and на or, потому что вы хотите продолжать изменять gcf до тех пор, пока оно не разделит и a, и b, так что вы выполняете цикл, пока он не делит один из них.

Ваш код будет:

a = 8
b = 6
gcf = min(a, b)  # minimum of a and b
while a % gcf != 0 or b % gcf != 0:  # OR instead of AND
    gcf -= 1
print(gcf)  # => 2
0 голосов
/ 29 мая 2018

Ваша реализация

Что касается вашей реализации, которую вы хотите зациклить, пока обе операции по модулю не будут равны нулю, это означает, что цикл пока одна or другая не равна нулю.Также обратите внимание, что gcf не может быть больше минимума обоих чисел.

a = 8
b = 6
gcf = min(a, b)  # This is the max value your gcf can take

while a % gcf or b % gcf:  # Use 'or' in your condition
    gcf -= 1

print(gcf) # 2

Встроенный math.gcd

Хотя для достаточно больших чисел вы хотитеиспользуйте более эффективную реализацию, которая использует алгоритм Евклида , это то, что делает math.gcd.Обратите внимание, что gcd обозначает наибольший общий делитель , который является математическим названием искомого числа.

import math

math.gcd(8, 6) # 2
...