一、原理
欧几里得算法(Euclidean Algorithm)又称辗转相除法,用于计算求两个非负整数的最大公约数,欧几里得算法一定可以在有限步内完成。
辗转相除法基于原理“两个整数的最大公约数等于其中较小值与两数相除余数的最大公约数”,即“Greatest Common Divisor (GCD)递归原理”,用公式表示为:
G
C
D
(
a
,
b
)
=
G
C
D
(
b
,
a
%
b
)
GCD(a,\, b)=GCD(b,\,a\%\,b)
GCD(a,b)=GCD(b,a%b)
实现欧几里的方法:递归法、非递归法。
一文搞定最大公约数(四种方法,赋原理和比较,超详细解答)_最大公约数原理
二、代码实现
2.1 定义法
def gcd(x, y):
while True:
# (x, y) = sorted([y, x % y], reverse=True) # 始终保证y是那个较小值,即x>y
x, y = y, x % y # 最小值永远是取模之后的数,因此直接这句就可以
if y == 0:
return x
2.2 递归
def gcd(x, y):
if x == 0: return y
if y == 0: return x
return gcd(x, y%x) if x < y else gcd(y, x%y)
2.3 位运算
可以使用位运算完成两数交换过程。
def gcd(x, y):
while True:
x = x % y # 将取模之后的结果给x,即将较小值给了x
# 使用三次异或运算交换两个数
y = y ^ x
x = x ^ y
y = y ^ x
# # 或者如下:
# x = x ^ y
# y = y ^ x
# x = x ^ y
if y == 0:
return x
(本文完整的pdf请关注公众号“张张学算法”,并回复“021”获取~)