python - 求两个数的最大公约数(常规思路)

本文介绍了使用Python实现两个数的最大公约数(辗转相除法),并探讨了放弃对复杂算法的过度追求,主张在学习过程中注重理解和应用。
摘要由CSDN通过智能技术生成

好吧,这只是一个思路,而数学上有更妙的思路,我才看到的,辗转相除法。
所以数学学的不深的诸君,不要再探索数学上的算法了!
至少我现在,开始不求甚解了,先速度的过完一本书,再回头看一些小项目,不再纠结基于数学的算法。例如如何判断一个数是素数,数学大神和it大神已经做到了极致,而随便抽出一个经典数学算法我都看不懂!

python求两个数字的最大公约数(辗转相除法)
240~670 ns

def gcd(a, b): #抄自百度百科
    while a != 0:
        a, b = b % a, a
    return b

lcm(a, b) = (a*b)/gcd(a,b) (证明可以根据数论里的“每个数都可以表示成素因子的乘积”)
可以这么理解,两个数a、b的最大公约数m的关系,a=a’ * m,b=b’ * m,m就是a、b的因子,而a’和b’是素数,于是一眼就看出a、b的公倍数就是a’ * b’ * m,即a*b/m

下面是我的硬求出来的
平均耗时9.09 µs

#求两个数的最大公约数
from random import randint
# a=randint(1,10000)
# b=randint(1,10000)
def 最大公约数(a,b):
    if a>b:a,b=b,a
    if b/a%1==0:
        return a#print("a:%d是b:%b的约数,最大公约数是:%d"%(a,b,a))
#         return
    z={
   }
    def 求质数因子组(a):
        n=a
        while 1:
            while 1:
                if (t:=n**0.5)%1==0:n=t
                else:break
            for i in range(2,int(t)):
                if n/i%1==0:
                    z[i]=1
                    n<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值