zoukankan      html  css  js  c++  java
  • 最小公倍数和最大公因数

    等我学完数论我就来填坑!!

    说到最大公因(gcd)),我们就不得不提辗转相除法,本身也是一种递归的方式,假设求a和b的最大公因数,那么基本步骤为:

    r = a % b

    a = b

    b = r

    直到余数为0(b=0)时,此时的a就是a和b的最大公因数

    代码为:

    def gcb(a, b):
        if b == 0:
            return a
        else:
            return gcb(b, a % b)
    
    
    if __name__ == "__main__":
        a = 4
        b = 5
        print(gcb(a, b))

    如果是判断一个列表的最大公因数,那我们在构造最大公因数之后,可以再构造一个递归的函数,基本的思想为:只要得出第[n-1]数和前面n-2个数的最大公因数就可以了

    def gcb(a, b):
        if b == 0:
            return a
        else:
            return gcb(b, a % b)
    
    
    def gcd_nums(nums):
        n = len(nums)
        if not nums:
            return 0
        if n == 1:
            return nums[0]
        else:
            return gcb(nums[n - 1], gcd_nums(nums[:n - 1]))
        
    if __name__ == "__main__":
        numbers = [11, 66, 88, -99, 0]
        print(gcd_nums(numbers))

    在最大公因数的基础上,我们可以得到最小公倍数(lcm),有一个公式:

    lcm  = (a * b) / gcd(a, b)

    def gcd(a, b):
        if b == 0:
            return a
        else:
            return gcd(b, a % b)
    
    
    def gcd_nums(nums):
        n = len(nums)
        if not nums:
            return -1
        if n == 1:
            return nums[0]
        else:
            return gcd(nums[n - 1], gcd_nums(nums[:n - 1]))
    
    # 递归的求解一组数的最大公倍数
    def lcm_nums(nums):
        n = len(nums)
        if not nums:
            return -1
        if n == 1:
            return nums[0]
        else:
            return lcm(nums[n - 1], lcm_nums(nums[:n - 1]))
    
    def lcm(a, b):
        return (a * b) // gcd(a, b)
    
    
    if __name__ == "__main__":
        numbers = [11, 66, 88, -99, 0]
        print(gcd_nums(numbers))
        print(lcm_nums(numbers))
  • 相关阅读:
    20150212-2015
    SM30维护视图添加按钮
    SAP保存操作记录CDHDR和CDPOS表
    20150123-慢慢
    20150124-轻轻
    维护 物料主数据 号码段
    ABAP DEMO-2018
    工具
    幽门螺杆菌资料收集
    MySQL 8 连接时出现 1251 和 2059 错误
  • 原文地址:https://www.cnblogs.com/canaan233/p/13723516.html
Copyright © 2011-2022 走看看