求两个不超过200位的整数的乘积_五十七、如何求出两个数的最小公倍数?

94d1baa5eaa58fd12b2c9705badeb1ac.png

「@Author:Runsen」

❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化。 「---- Runsen」

先问你们一个小学问题:「如何求两个整数的最小公倍数?」

上次,我介绍了碾转相除法和更相减损术来求最大公约数。

其实,在我的脑海中,小学的课本上,应该有介绍最小公倍数和最大公约数的关系。

「两个数的乘积等于这两个数的最大公约数与最小公倍数的乘积」

因此,可以利用两者的关系求出最小公倍数。只需要对变量进行值的保存即可,那么求两个整数的最小公倍数的代码变得非常简单。

# 碾转相除法
def gcd(a, b):
    x ,y = a, b
    # 如果b是0,退出循环
    while b:
        # 循环赋值
        a, b = b, a%b
    return (x*y)/a
print(gcd(100,25)) #100

# 更相减损术
def MaxCommDivisor(m, n):
    x, y = m , n
    # 如果两个整数都是偶数,就使用2约简,需要记录约简次数
    index = 1
    while m % 2 == 0 and n % 2 == 0:
        m = m / 2
        n = n / 2
        index = index * 2
    # 用较大的数减去较小的数,因此需要判断m和n的大小,确保m是最大的。
    if m < n:
        m, n = n, m
    # 用较大的数减去较小的数,如果得到的差恰好等于较小的数,则停止。否则,对较小的数和差值重复这个过程。
    while m - n != n:
        diff = m - n
        if diff > n:
            m = diff
        else:
            m = n
            n = diff
    return (x*y) / (n * index)

print(MaxCommDivisor(24, 12)) #24

暴力法

对于最大公约数和最小公倍数的求法,暴力法也是一种直观的解法。。

最大公约数,就是能同时被两个数整除的最大整数,既然要能同时被两个数整除,那么这个数必然是小于等于两个数中的较小者,因此,可以直接从较小值反向遍历到1,最后能同时被两个数整除的数便是最大公约数。

最小公倍数,就是能同时将两个数整除的最小整数,和最大公约数逻辑一样,那这个数必然大于等于两个数中的较大者,因此,可以直接从较大值开始递增遍历,最先出现能将两个数整除的数便是最小公倍数。

def gcd(a, b):
    # 逆向暴力
    t = a  # 将a值赋给t
    while t > 0:
        if a % t == 0 and b % t == 0:  # 若a除以t的余数和b除以t的余数都为0时,跳出循环
            break
        t = t - 1  # t>0时,每循环一次,t值减一
    print("枚举法得最大公约数为:", t)  # 当跳出循环时,输出t值即为最大公约数
    print("枚举法得最小公倍数为:", a*b/t)  # 
    
gcd(5,10)
# 枚举法得最大公约数为: 5
# 枚举法得最小公倍数为: 10.0

gcd(10,5)
# 枚举法得最大公约数为: 5
# 枚举法得最小公倍数为: 10.0

短除法

短除法本质上是一种分解质因数的方法。

用短除法找出几个数中两两的约数,直到最后两两互质为止。此时,它们的最大公约数为短除符号左边所有的数联乘起来,最小公倍数为短除符号以外的所有数联乘起来。

例如,求12、20的最大公约数和最小公倍数。

615c24655dd2f3544a4f43c3c235e6f4.png

短除竖式左边是这两个数的公有质因数,竖式下边是这两个数各自独有的质因数。

根据两个数的最小公倍数一定能被这两个数整除,所以,最小公倍数必须包含这两个数里的所有质因数。

竖式左边的公有质因数与竖式下边各自独有质因数的连乘积,才是最小公倍数的道理,就在于此。

因此,12、20的最大公约数等于2*2=4,12、20的最小公倍数等于2*2*3*5=60

如果求三个数或者三个数以上的最大公约数和最小公倍数,短除法依然适用。

但是需要注意:在求三个数的最大公约数时,如果是两个数中共同的质因数筛去,则不需要相乘。三个数的最大公约数是三个数中共同的质因数相乘。

在求三个数的最小公倍数时,两个数中共同的质因数要筛去,如果不筛去,所求出来的虽然也是这三个数的公倍数,但不是最小公倍数。

所以,只要有两个数能被同一质数整除,就应该继续除下去,直到除到竖式下边的三个商两两互质为止。

3d69044bd933db4aa539c10b90a78201.png

所以15、30和50的最小公倍数是5×2×3×5=150。而最大公约数是三个数中共同的质因数相乘,也就是只有5。

编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化。

短除法的本质上就是对数进行分解质因数,

比如: 15分解成5*3,30分解成5*3*2,50分解成5*2*5,然后取出相同的质因数的乘积,就是最大公约数,将所有的质因数的相乘,就是最小公倍数。

下一篇,将介绍短除法中的重要的因式分解。

❝ 本文已收录 GitHub,传送门~[1] ,里面更有大厂面试完整考点,欢迎 Star。

Reference

[1]

传送门~: https://github.com/MaoliRUNsen/runsenlearnpy100

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值