用python实现求两个整数的最大公约数
def gcd(a, b): """计算最大公约数""" while b: a, b = b, a % b return abs(a)
下面是对 gcd
函数的逐行解释:
def gcd(a, b):"""计算最大公约数"""
- 定义函数:这里定义了一个名为
gcd
的函数,它接受两个参数a
和b
,并返回它们的最大公约数(GCD)。函数文档字符串用来描述它的功能。
while b:
- 循环条件:这行代码是一个
while
循环,它会持续执行,直到b
为 0。根据辗转相除法的原理,只要b
不为 0,就可以继续计算最大公约数。
a, b = b, a % b
- 更新值:在循环中,通过同时赋值来更新
a
和b
的值:a
被赋值为当前的b
。b
被赋值为a
对b
的模(余数)a % b
。
- 这个过程利用了辗转相除法的核心思想:最大公约数(gcd(a, b))等于最大公约数(gcd(b, a % b))。
return abs(a)
- 返回结果:当循环结束时,
b
会变为 0,此时a
就是a
和b
的最大公约数。函数返回abs(a)
,即a
的绝对值。这是因为最大公约数的定义通常是非负的。
总结
这个 gcd
函数实现了求两个整数的最大公约数。通过反复取余的方式逐步逼近这个值,直到其中一个数为零。最终返回的就是它们的最大公约数。这一算法的效率很高,时间复杂度为 O(log(min(a, b)))。
我们来计算 8 和 6 的最大公约数(GCD),使用前面提到的 gcd
函数。
示例:计算 8 和 6 的最大公约数
-
初始化:将
a = 8
,b = 6
。 -
第一次迭代:
while b:
这里b
是 6,继续执行。- 计算
a % b
,即8 % 6 = 2
。 - 更新值:
a = 6
,b = 2
。
-
第二次迭代:
while b:
这里b
是 2,继续执行。- 计算
a % b
,即6 % 2 = 0
。 - 更新值:
a = 2
,b = 0
。
-
结束循环:
- 由于
b
现在为 0,循环结束。 - 返回
abs(a)
,即abs(2)
,结果是 2。
- 由于
结论
因此,8 和 6 的最大公约数是 2。
总结步骤
与之前的示例相同,我们通过不断取模的方法逐步缩小问题的规模。最终,我们得到了这两个数的最大公约数,即 2。
计算 6 和 8 的最大公约数(GCD)与计算 8 和 6 的过程非常相似,因为最大公约数的顺序并不影响结果。我们来详细看一下步骤:
示例:计算 6 和 8 的最大公约数
-
初始化:将
a = 6
,b = 8
。 -
第一次迭代:
while b:
这里b
是 8,继续执行。- 计算
a % b
,即6 % 8 = 6
(因为 6 小于 8,结果是 6)。 - 更新值:
a = 8
,b = 6
。
-
第二次迭代:
while b:
这里b
是 6,继续执行。- 计算
a % b
,即8 % 6 = 2
。 - 更新值:
a = 6
,b = 2
。
-
第三次迭代:
while b:
这里b
是 2,继续执行。- 计算
a % b
,即6 % 2 = 0
。 - 更新值:
a = 2
,b = 0
。
-
结束循环:
- 由于
b
现在为 0,循环结束。 - 返回
abs(a)
,即abs(2)
,结果是 2。
- 由于
结论
因此,6 和 8 的最大公约数也是 2。
总结
无论是计算 6 和 8,还是 8 和 6,得到的结果都是相同的,最大公约数是 2。这表明计算的顺序不影响最终结果。