“辗转相除法”求两个数的最大公约数+最小公倍数

“辗转相除法”求两个数的最大公约数+求最小公倍数:

1. 过程模拟:

如求两个正数8251和6105的最大公因数:
(分析:辗转相除→余数为零→得到结果)
解:8251=6105×1+2146
显然8251与6105的最大公因数也必是2146的因数,同样6105与2146的公因数也必是8251的因数,所以8251与6105的最大公因数也是6105与2146的最大公因数。

6105=2146×2+1813
2146=1813×1+333
1813=333×5+148
333=148×2+37
148=37×4+0

则37为8251与6105的最大公因数。

# python实现
def f(a, b):
    if a<b:
        a, b = b, a

    c = 1   # 余数
    while c!=0:
        c = a%b
        a = b
        b = c
    return a
def main():
    a = f(6105, 8251)
    print(a)
main()

递归实现:(欧几里得定理:gcd(a, b) = gcd(b, a%b) )

8251=6105×1+2146: gcd(8251, 6105)
6105=2146×2+1813: gcd(6105, 2146)
2146=1813×1+333 : gcd(2146, 1813)
1813=333×5+148 : gcd(1813, 333)
333=148×2+37 : gcd(333, 148)
148=37×4+0: gcd(148, 37)
37=0×0+37: gcd(37, 0)


def gcd(a, b):
    if b==0:          # 终止条件
        return a
    return gcd(b, a%b)      # return 直到将最终结果 a 带出去
def main():
    a = gcd(8251, 6105)
    print(a)
main()

2.最小公倍数=两数乘积 / 最大公约数

def f(a, b):  # 求最大公约数
    if a<b:
        a, b = b, a

    c = 1
    while c!=0:
        c = a%b
        a = b
        b = c
    return a
    
def g(a, b):    # 求最小公倍数
    return a*b/f(a, b)
    
def main():
    maxx = f(6105, 8251)
    minn = g(3, 9)
    print(maxx)
    print(minn)
main()
发布了16 篇原创文章 · 获赞 1 · 访问量 469
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览