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 q

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 p

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 ret   

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)

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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐