辗转相除法

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

算法过程:

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

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

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

原理:

例如,求1112和695的最大公约数。假设最大公约数为n,那么1112和696分别可以看成是ijn
辗转相除法_第1张图片
这里需要证明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)
    }
}

你可能感兴趣的:(神奇的算法,最大公约数,辗转相除法)