描述
欧几里得算法(又称辗转相除法 ),可以实现给定两个数a,b,求出其最大公约数gcd。
算法
用较大数(记为max)对较小数(记为min)取余,当余数(记为remainder)不为零,则将余数remainder当做较小数min,原min作为max,重复max对min取余,直到余数为0,此时min为最大公约数gcd。
原理
- 设
a > b
,且a % gcd = 0,b % gcd = 0
;则有(ma ± nb) % gcd = 0
,其中m、n均为整数。 - 设
a ÷ b = n1余r1
,则有r1 = a - n1 × b
;r1满足ma ± nb
条件,则r1 % gcd = 0
;同理则有(b - r1) % gcd = 0
; - 重复前一步直到没有余数
优势
跟其他算法(比如将a,b同时除以相同的数等等)相比,迭代次数减少,在a,b数值均很大的情况下,效果尤为明显。
代码实现
// 默认 a>b
public int gcd(int a, int b) {
return (b == 0) ? a : gcd(b, a % b);
}