求最大公约数算法(欧几里得算法)的实现!!!

时间:2022-04-25 09:46:58

看一个例子:试找出40和64的最大公约数

  • 64 ÷ 40 = 1 ⋯⋯ 24
  • 40 ÷ 24 = 1 ⋯⋯ 16
  • 24 ÷ 16 = 1 ⋯⋯ 8
  • 16 ÷ 8 = 2 ⋯⋯ 0
  • 得到余数为0就以为着我们算到这一步就可以了。我们使用的最后一个余数是8,因此40和64的最大公约数就是8。
根据上图写一个递归函数来求解最大公约数
以被除数为a, 除数为b, 余数为ca ÷b = ...余 c ( c = a%b )
再将b作为被除数  ,  余数作为除数...一直循环下去直到余数为0时,
 最后一个除数就是答案
这就是欧几里得算法
递归边界:除数b为0, 那么获得这个新除数的a (这个a是上一个式子中的a%b),就是答案!
递归部分:除数b不为0 , 下一个式子的被除数是当前式子的除数b,
     下一个式子的除数是当前式子的余数(a%b) 

这样就可以写出一个递归函数:
int gcd(int a, int b) {
   if(b == 0) return a;  //递归函数先写边界 
   else return gcd(b, a%b);  //再写递归的内容 
}
再精简一下: 
求最大公约数:
int gcd(int a, int b) {
return b == 0 ? a : (b, a%b);
}