python用递归方式实现最大公约数_Python实现求两数最大公约数(四种方法)

1. 辗转相除法(while循环实现)

(1) 两数求余temp = p % q

(2) temp = 0时,q为最大公约数

(3) temp !=0时,p = q;q = temp注:该循环的是否继续的判断条件就是temp是否为0

def fuc(p, q):

temp = p % q

while temp!=0:

p = q

temp = p

q = temp % q

return q1

2

3

4

5

6

7

2.辗转相减法

(1) 如果p > q ,p = p - q

(2) 如果q > p ,q = q - p

(3) 假如p = q ,则 p或q 是最大公约数

(4) 如果p != q,则继续继续相减,直至p = q

def fuc2(p, q):

while p!=q:

if p>q:

p = p - q

else:

q = q - p

return p1

2

3

4

5

6

7

3. 枚举法

(1) 将两数p,q中最小的放到smaller中

(2) 用p,q分别对i(1到smaller之间)求余数,看是否能被整除

(3) 直到p,q同时被i整除

(4) 如不能整除,i+1后继续,直到i等于smaller

def fuc3(p, q):

if p>q:

smaller = q

else:

smaller = p

for i in range(1, smaller+1):

if (p%i == 0) and (q%i == 0):

ret = i

return ret1

2

3

4

5

6

7

8

9

4.欧几里得算法(辗转相除的递归实现)

该方法其实就是辗转相除法的递归版本实现

(1) 如果q=0,返回p;判断p>q

(2) 如果p>q,则p、q的最大公约数等于q与p%q的最大公约数,以此递归

def fuc4(p, q):

if q == 0:

return p

return fuc4(q, p % q)1

2

3

4

第四种方法是不是代码最少,可以说是极简版,而且性能适中。但是当p,q数值较大时,递归效率效率可能就不太占优势了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值