问题:求两个数的最大公约数。

对于该问题:首先映入眼帘的就是两个数n m中寻找一个最小的值。然后从该值遍历到1.一旦 n%i==0&&m%i==0 那么i就是这个最大公约数啦。原理不言而喻。代码就不附上了。(不纳入方法好了)

 

方法1:就是比较经典的欧几里德算法。其中本质上的原理是这样的。gcd(n,m)表示n和m的最大公约数。

1:gcd(n,m) = gcd(n%m,m)  (n>m)

2:gcd(0,a) = a 这是合法的。因为0可以当做被除数(废话,但是为了严谨一点再次说明一下)。

式1是递推关系。式2是判断终点。 完全符合递推关系的定义啊。(不知道Kunth能不能求出这个的闭合形式呢。)

 

先解释一下原理:

对于1:令r=n%m 即证明 gcd(n,m) = gcd(r,m). 其中n = km+r (k属于正整数,因为n>m所以k!=0).那么r = n-km.

也就是说要证明:gcd(n,m) = gcd(n-km,m)。也就是证明n-km和m的最大公因子是n和m的最大公因子

根据素数表达式。n-km有且只有 n与m的公因子。那么简单就能知道n-km和m的最大公因子就是n和m的最大公因子。得证。

代码实现如下:

int GCD(int n,int m)
{
    if(m==0){return n;}
    if(n>m){return GCD(m,n%m);}
    else{return GCD(n,m%n);}
}
编程之美---欧几里得求最大公约数

相关文章:

  • 2021-11-18
  • 2022-02-10
  • 2021-08-14
  • 2021-12-23
  • 2021-10-13
  • 2021-11-13
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-01-29
  • 2021-10-20
  • 2022-03-02
  • 2021-09-23
  • 2021-06-02
  • 2021-05-17
  • 2021-11-25
相关资源
相似解决方案