1. 题目描述

对于数 m 和数 n ,求 m 和 n 的最大公因数(Gcd)。
最大公因数是能同时整除二者的最大整数。

2. 题目分析

有公式:
当 m>=n 时,有Gcd(m,n)【也就是m,n的最大公因数】=Gcd(n,m%n),依照此种规律类推,当 Gcd 函数的第二个参数为0时,第一个参数就是答案。
比如:
Gcd(50,15)=Gcd(15,5)=Gcd(5,0)=5

3. 代码实现

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int gcd(int m,int n){
  4. if(n>m) swap(m,n);
  5. while(n>0){
  6. int remainder=m%n;
  7. m=n;
  8. n=remainder;
  9. }
  10. return m;
  11. }
  12. int main(){
  13. int m=50;
  14. int n=15;
  15. cout<<gcd(50,15)<<endl;
  16. }

4. 算法复杂度的分析

若M=1989,N=1590,则余数序列是399,393,6,3,0.我们将余数的大小近似于问题的规模,可以发现在一次迭代中余数并不按照一个常数因子递减。但是我们可以证明,在两次迭代后,余数最多是原始值的一半,故而迭代次数最多是
2logN=O(logN)。证明的详细过程可见书 P23下。

2020.1.5 更新
递归写法:欧几里得算法 1.5.cpp
上文中的是迭代的写法(也就是循环),然后这次写了一个递归的写法,虽然效率没有迭代高,但是可以作为参考来理解递归的思想吧。