python - 最大公分母函数没有意义
问题描述
我发现有一个功能有效,但我不明白它为什么有效。我认为它应该输出 8,但它给了我正确的答案 4。顺便说一下,这是 Python。
def gcd (a, b):
while(b != 0):
t = b
a = b
b = t % b
return a
同样,当 a = 8 和 b = 20 时,它正确地吐出 4,但是当我执行 print(8 % 20) 时,它吐出 8。那我错过了什么?
解决方案
您在这里指定的是欧几里德方法[wiki]。您的代码中有错字,应该是:
def gcd (a, b):
while(b != 0):
t = a
a = b
b = t % b
return a
请注意,它在每次迭代中“交换”a
和。b
确实,如果您调用gcd(8, 10)
比第一个循环之前a = 8
和b = 20
.
然后在第一次迭代之后a = 20
和b = 8 % 20
,所以在第一次迭代之后a = 20
和b = 8
。下一轮我们计算a = 8
和b = 20 % 8
,这等于b = 4
。然后最后一轮将设置a = 4
,b = 8 % 4
所以b = 0
我们可以停止。
正如 Wikipedia 文章所指定的,它的工作原理是:
欧几里得算法是基于两个数的最大公约数不变的原理,即如果较大的数被其与较小数的差值代替,则它们的最大公约数不变。
换句话说,这意味着如果a < b然后gcd(a, b) = gcd(a, b - a)。我们可以继续从b中减去a ,直到达到0和b之间的值,因此gcd(a, b) = gcd(a, b mod a)。由于我们知道a mod b介于0(包括)和b(不包括)之间,因此我们可以交换两个数字以确保两者中最大的再次位于第一位。我们可以继续这样做,直到我们为最小的一个达到零。
推荐阅读
- python - 密集层权重形状
- ios - UIApplication 的 `beginIgnoringInteractionEvents` 不起作用
- django - 允许用户上传个人资料图片但 1) 表单无效 2) 未正确保存
- html - div标签的保证金问题
- java - Java Collections.rotate() 实现算法
- php - 如何以原始源格式导出数据表副本。即相同的样式,背景颜色
- mysql - SQL 查询没有给出想要的结果
- authentication - Guardian.Plug.current_resource(conn) 返回 nil
- html - xml, xslt - 所有页面上的页眉和页脚,具有连续的表格数据内容
- android - 向/从 SQLite 插入和检索数据