欧几里得算法(辗转相除法),用于求两个整数的最大公约数。
原理:gcd(a,b)=gcd(b,a%b),(a为大数,b为小数)
本质:把球两个非负整数的最大公约数转化为求两个较小数的最大公约数。
复杂度:时间复杂度O(logn),空间复杂度O(n)
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
扩展欧几里得算法
对于不全为0的非负整数a,b;gcd(a,b)表示其最大公约数那么必然存在整数对x,y使得gcd(a,b)=ax+by。
int exgcd(int a, int b, int& x, int& y) {
if (!b) {
x = 1, y = 0;
return a;
}
int r = exgcd