使用Python求解最小公倍数与最大公约数

问题描述:

        给定两个正整数,求它们的最大公约数和最小公倍数。

提高要求:

       三个以上数的求解。

解题思路:

       对于这个问题,求最大 公约数的算法有很多,例如:穷举法,即传进来两个数,选择最小的那个数,作为 最开始的最大公约数,向下穷举,知道都可以被整除为止,但是这种算法太笨拙。还有欧几里得算法,辗转相除。我采用的算法公式:gcd(a, b) = gcd(b, a%b),前提条件是a>b,即保证大数在前。最小公平倍数的公式为:a*b/gcd(a,b)。有了这个公式就可以进行计算求解,对于三个以上的数求解,利用穷举法可以求得,但是效率慢了很多, 但是在条件控制上优化一下,还是可以的。我这次试用python编写,原因大家一看便知:

求解最大公约数的代码:

def gcd(x, y):
    """
    欧几里得算法求解两个数的最大公约数
    :param x: 第一个数
    :param y: 第二个数
    :return: 最大公约数
    """
    # 保证大数在前
    if y > x:
        x, y = y, x
    if y == 0:
        return x
    # 递归递归调用,公式为: gcd(a, b) = gcd(b, a % b){a > b}
    return gcd(y, x % y)

非常简洁的代码,交换两个值再也不用第三个变量了。

求解最小公平倍数的代码:

def lcm(x, y):
    """
    计算两个数的最小公倍数
    :param x: 第一个数
    :param y: 第二个数
    :return: 最小公倍数
    """
    # 公式: a, b两个数的最小公倍数等于a*b除以a,b的最大公约数
    return int(x*y/gcd(x, y))

三个以上的数的求解函数:

def gcd_lcm(*x):
    """
    穷举法计算最小公倍数与最大公约数
    :param x: 不定长参数
    :return:
    """
    num = []
    flag, gcd_, lcm_ = 1, 1, 1
    for i in x:
        num.append(i)
        # 计算这一组数中的乘积,即最大公倍数
        lcm_ *= i
    # 计算这组数中的最大最小值
    max_, min_ = max(num), min(num)
    # 穷举计算最大公约数:
    while min_ > 0:
        for x in num:
            if x % min_ == 0:
                flag = 1
            # 当前值与待定的公因数的余数不等于0
            else:
                # 判断的标志设为0,并且不继续往下验证其他的数,进行下一个公因数验证
                flag = 0
                break

        if flag == 1:
            gcd_ = min_
            break
        min_ -= 1

    # 穷举计算最小公倍数, 原理类似最大公因数的求解
    while max_ <= lcm_:
        for y in num:
            if max_ % y == 0:
                flag = 1
            else:
                flag = 0
                break
        if flag == 1:
            lcm_ = max_
            break
        max_ += 1
    return gcd_, lcm_

运行与调试结果:

断点调试查看变量的值的变化:

三个以上的数的计算结果:

输入:3,15,18

结果为:最大公因数,最小公倍数 = 3, 90

 

### 使用 Python 实现最大公约数最小公倍数的函数 #### 方法一:基于 `math` 模块的功能 自 Python 3.5 起,标准库中的 `math` 模块提供了内置函数 `gcd()`,能够直接计算两个整数的最大公约数。而在 Python 3.9 中新增了 `lcm()` 函数,可用来计算两个或多个整数的最小公倍数。 以下是具体代码示例: ```python import math # 计算两个数的最大公约数 a = 15 b = 20 print(f"GCD of {a} and {b} is {math.gcd(a, b)}") # 计算两个数的最小公倍数 print(f"LCM of {a} and {b} is {math.lcm(a, b)}") # 对于多个数的情况 numbers = [4, 5, 6] lcm_result = math.lcm(*numbers) print(f"LCM of {numbers} is {lcm_result}") ``` 上述方法简单高效,适用于不需要额外定义函数的场景[^1]。 --- #### 方法二:手动实现 GCD 和 LCM 的逻辑 如果希望不依赖外部模块而自行实现功能,则可以通过欧几里得算法来求解最大公约数,并进一步推导出最小公倍数。 ##### 自定义 GCD 函数 欧几里得算法的核心原理在于反复取余操作直到余数为零为止。最终非零值即为两数的最大公约数。 ```python def gcd_custom(x, y): while y != 0: x, y = y, x % y return abs(x) # 测试 a = 15 b = 20 result_gcd = gcd_custom(a, b) print(f"GCD of {a} and {b} using custom function is {result_gcd}") ``` ##### 自定义 LCM 函数 已知关系 \( \text{GCD}(a, b) \times \text{LCM}(a, b) = |a \cdot b| \),由此可以得出任意两个正整数的最小公倍数表达式。 ```python def lcm_custom(x, y): if x == 0 or y == 0: return 0 return abs(x * y) // gcd_custom(x, y) # 测试 a = 15 b = 20 result_lcm = lcm_custom(a, b) print(f"LCM of {a} and {b} using custom function is {result_lcm}") ``` 对于多于两个数值的情形,可通过迭代方式依次应用以上公式完成整个序列的处理过程[^3][^4]。 --- #### 综合案例分析 当面对更复杂的需比如涉及三个及以上变量时,推荐采用如下策略逐步扩展基础版本: 1. 定义辅助工具分别负责单次比较; 2. 利用循环结构串联起全部输入项之间的关联性。 下面给出一段完整的示范程序片段说明这一思路的实际运用情况: ```python from functools import reduce def gcd_multi(numbers): """返回一组数的最大公约数""" def _gcd_two(x, y): # 辅助内部函数 while y != 0: x, y = y, x % y return abs(x) return reduce(_gcd_two, numbers) def lcm_multi(numbers): """返回一组数的最小公倍数""" def _lcm_two(x, y): # 辅助内部函数 if x == 0 or y == 0: return 0 return abs(x * y) // _gcd_two(x, y) return reduce(_lcm_two, numbers) nums = [8, 12, 16] res_gcd = gcd_multi(nums) res_lcm = lcm_multi(nums) print(f"The greatest common divisor of {nums} is {res_gcd}.") print(f"The least common multiple of {nums} is {res_lcm}.") ``` 此方案不仅兼容性强而且具备良好的可读性和维护便利度特点。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值