算法起始---三种最大公约数求解算法

  本文使用python语言实现欧几里得算法、连续整数检测算法、质因数求积算法三种方法求最大公约数,并且附加埃拉托色尼筛选法求质数。

  有两种思想,就像摆放在天鹅绒上的宝石那样煜煜生辉,一个是微积分,另一个就是算法。微积分以及在微积分基础上建立起来的数学分析体系造就了现代科学,而算法则造就了现代世界。
  By:大卫.柏林斯基
  个人博客–点木
  欢迎点击!!!!

函数方法定义:

# 求解m、n两值的最大公约数
gcd(m,n):

函数调用:

if __name__ == '__main__':
    print(gcd1(60,24))
    print(gcd2(45,24))
    print(gcd3(100,24))

欧几里得算法

  • 第一步:如果n=0,返回m的值作为结果,同时过程结束;否则,进入第二步
  • 第二步:m除以n,将余数赋给r。
  • 第三步:将n的值赋给m,将r的值赋给n,返回第一步。
# 欧几里得算法
# gcd1(60,24)=12
def gcd1(m,n):
    if n==0:
        return m;
    else:
        return gcd1(n,m%n);

连续整数检测算法

  • 第一步:求出m、n中较小的一个数t
  • 第二步:判断t是否能被m、n同时整除,能够则返回t,不能则t=t-1
# 连续整数检测算法
# gcd2(60,24)=12
def gcd2(m,n):
    t=n if m>n else m
    while not (m%t==0 and n%t==0):
        t=t-1
    return t

质因数求积算法

  • 第一步:分别求出m、n的所有质因数
  • 第二步:返回两个质因数组中含有的公共质因数的积
# 质因数求法(我们平时所使用的方法)
# gcd3(60,24)=12
def gcd3(m,n):
    # 求解质因数算法
    M=primeFactors(m)
    N=primeFactors(n)
    result=1
    for i in range(len(M)):
        j=0
        while j <len(N):
            if N[j]==M[i]:
                result=result*M[i]
                del N[j]
                break
            else:
                j=j+1
    return result
  • 因为此算法需要求出正整数的质因数,因此给出一种求解算法

埃拉托色尼筛选法求质数

# input:一个正整数
# output:包含所有小于等于n的质数的数组L
# sieve(20)=[2, 3, 5, 7, 11, 13, 17, 19]
def sieve(num):
    A=[]
    # A数组本应为2—num的一个数组,为了简化代码,使数字和下标对应。
    for i in range(num+1):
        A.append(i)
    for i in range(2,math.floor(math.sqrt(num))):
        if A[i]!=0:
            j=i*i
            while j<=num:
                A[j]=0
                j=j+i
    L=[]
    for i in range(num+1):
        if A[i]==1 or A[i]==0:
            continue
        else:
            L.append(A[i])
    del A
    return L

正整数质因数求解

# input:一个正整数
# output:质因数数组L,从小到大排列
# primeFactors(20)=[2, 3, 7]
def primeFactors(num):
    Num=sieve(num);
    L=[]
    for i in Num:
        while num%i==0:
            num=num/i
            L.append(i)
    return L
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值