Python实现求两数最大公约数(四种方法)

本文介绍了四种不同的算法来寻找两个整数的最大公约数:辗转相除法(使用while循环和递归实现)、辗转相减法及枚举法。每种方法都有其特点,如辗转相除法的递归实现简洁但可能在大数下效率降低。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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数值较大时,递归效率效率可能就不太占优势了。

### 使用质因数分解法计算最大公约数 为了利用质因数分解法来计算两个整数的最大公约数,首先需要理解如何对给定的整数执行质因数分解。质因数分解意味着找到能够乘积得到原数值的所有素数因子。 #### 方法概述 质因数分解法的核心在于先分别找出两个数各自的全部质因数及其指数表示形式,之后比较两者共有的质因数并取较小的那个幂次作为公共部分,最后将这些共同拥有的质因数相乘即为所最大公约数[^3]。 #### Python实现代码 下面是一个基于上述原理编写的Python程序: ```python from collections import Counter import math def prime_factors(n): i = 2 factors = [] while i * i <= n: if n % i: i += 1 else: n //= i factors.append(i) if n > 1: factors.append(n) return factors def gcd_by_prime_factorization(a, b): # 获取两数各自所有的质因数列表 pf_a = prime_factors(abs(a)) pf_b = prime_factors(abs(b)) # 统计各质因数出现次数 count_pf_a = Counter(pf_a) count_pf_b = Counter(pf_b) # 找到交集中的最小值 common_primes = set(count_pf_a).intersection(set(count_pf_b)) result = 1 for p in common_primes: min_power = min([count_pf_a[p], count_pf_b[p]]) result *= int(math.pow(p, min_power)) return result # 测试例子 print(gcd_by_prime_factorization(48, 180)) # 输出应该是 12 ``` 此段代码定义了一个`prime_factors()`函数用来获取单个数字的质因数组成;接着实现了`gcd_by_prime_factorization()`函数,该函数接收两个参数a和b,并返回它们之间通过质因数分解方式获得的最大公约数
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值