Python:三种方法计算最大公约数和最小公倍数(欧几里德法、穷举法、stein算法)

本文介绍了使用穷举法、欧几里德法和Stein算法来计算两个非负数的最大公约数和最小公倍数。在Python中,通过不同的方法实现,包括当一个数为0的情况、辗转相除法和Stein算法的细节,以及涉及到的二进制位运算符。
摘要由CSDN通过智能技术生成

Python:三种方法计算最大公约数和最小公倍数

题目:求取任意两个非负数(至多一个数为0)的最大公约数和最小公倍数;
参考资料:Python解决求最大公约数和最小公倍数问题 link;最小公约数(欧几里得算法&stein算法) link

1.穷举法

两个非负数(至多一个数为0)的存在情况:其中一个数为0;两个数均为正数。当两个数中有一个数为0时,最大公约数为另一个非零数;当两个均为正数时,选择较小的正数(两个数的最大公约数肯定小于或等于较小的数),从大到小进行列举,得到的公约数即为最大公约数。

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

实现代码如下:

// An highlighted block
#输入参数
#最大公约数
def gcd_exhaus(a,b):
    if a==0 and b==0:
        print("请重新输入参数")
    #break
    elif min(a,b)==0:
        return max(a,b)
    elif a==b:
        return a
    else:
        a,b=max(a,b),min(a,b)
        for i in range(b,0,-1):  #从大到小列举
            if a%i==0 and b%i==0:
                return i
                break
            else:
                continue

gcd_exhaus(8,4)

#最小公倍数
def lcm_exhaus(a,b):
    return a*b/gcd_exhaus(a,b)

lcm_exhaus(8,4)   

2.欧几里德法

欧几里德法也称辗转相除法,假设有两个整数a、b,且满足条件a>b,若a%b不为0,则对a、b求最大公约数等价于对b、(a%b)求最大公约数。依此类推,直至两数可以整除。

实现代码如下:

// An highlighted block
#最大公约数
def gcd_euclid(a,b):
    if a==0 and b==0:
        print("请重新输入参数")
    #break
    elif min(a,b)==0:
        return max(a,b)
    else:
        a,b=max(a,b),min(a,b)
        if a%b==0:
            return b
        else:
            return gcd_euclid(b,a%b)
        
gcd_euclid(12,3)    

#最小公倍数
def lcm_euclid(a,b):
    return a*b/gcd_euclid(a,b)

lcm_euclid(12,3)

3.Stein算法

欧几里德算法是计算两个数最大公约数的传统算法,无论从理论还是从实际效率上都是很好的。但当出现大素数时,欧几里德法则存在较大的缺陷。

Stein算法:
假设 A 1 = A , B 1 = B , C 1 = 1 A_1=A,B_1=B,C_1=1 A1=A,B1=B,C1=1
for n = 1 , 2 , 3 , . . . n=1,2,3,... n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值