看一个例子:试找出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);
}