辗转相除法
约 10 分钟
辗转相除法(欧几里得算法)能极快地求最大公约数,它基于一条性质:
做法是用大数除小数取余,再拿"小数"和"余数"重复,直到余数为 0,此时的除数就是答案。
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
举例 :;,返回 4。每步余数迅速变小,复杂度只有 ,比逐个试快无数倍。
用它可以顺手求最小公倍数:。坑:先除后乘,写成 a/gcd*b 而不是 a*b/gcd,避免 a*b 中途溢出。递归写法简洁,也可写成 while 循环版,效果一样。
小纸条
求 gcd(12,8):12%8=4,再 gcd(8,4):8%4=0,答案是几?
登录 后可看答案