辗转相除法

这是用来求最大公约数的算法。

算法过程:

求a,b的最大公约数,假设a>b;

取m=a%b,a=b,b=m;

重复上述过程知道m=0,此时的b就是最大公约数。

原理:

例如,求1112和695的最大公约数。假设最大公约数为n,那么1112和696分别可以看成是ijn
在这里插入图片描述
这里需要证明a、b的最大公约数和b、m的最大公约数相同。

基于以上假设, a = i × n a=i \times n a=i×n b = j × n b=j \times n b=j×n m = ( i % j ) × n m=(i \% j) \times n m=(i%j)×n

很明显,a、b、m具有相同的最大公约数。

代码:

func MaxDivisor(a, b int) int {
    if a < b {
        a, b = b, a
    }
    for m := a % b; m != 0; m = a % b{
        a, b = b, m
    } 
    return b
}

递归版:

func MaxDivisor(a, b int) int {
    if a < b {
        a, b = b, a
    }
    if b == 0 {
        return a
    } else {
        return MaxDivisor(b, a % b)
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值