用Python求最大公约数GCD(欧几里得算法)

一、原理

欧几里得算法(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”获取~)
 

  • 21
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Satisfying

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值