欧几里得算法&其时间复杂度
欧几里得算法&时间复杂度
SeekLuna 2023.6.11
最大公约数
int gcd(int a,int b){
return !b ? a : gcd(b,a % b);
}
最小公倍数
int lcm(int a,int b){
return a / gcd(a,b) * b;
}
细节!
用欧几里得算法求$\gcd(a,b)$,无需关心a和b的大小
求$\operatorname{lcm}(a,b)$,应该先除后乘
$a,b$不同时为0,$\gcd(a,0),a\ne 0,\gcd(a,0) = a$
求$\gcd(a,b)$,令$a\ge b$,可以证明$a \bmod b \le \frac{a}{2};$
如果$b \le \frac{a}{2},a \bmod b < b \le \frac{a}{2}$,则$a \bmod b \le \frac{a}{2};$
如果$b > a,a0$除以$b$的商为$1$,则$a \bmod b;$
在欧几里得算法中,参数$b$的值每至少减半$(b = b / 2)$,时间复杂度为$:O(\log(n)),n = \max(a,b)$

浙公网安备 33010602011771号