int gcd(int a, int b) {
if (b == 0)
return a;
elsereturn gcd(b, a%b);
}
扩展欧几里得问题
对于ax + by = c; 在 c % gcd(a,b) = 0的时候,我们一般先求 a/gcd(a,b) x + b/gcd(a,b) y = 1的解,然后在扩大c倍,就是原问题的解。当然c % gcd(a,b) != 0 的时候,原问题无解。
根据下面参考文献中的原理,我们可以得到下面的程序:
#include<iostream>usingnamespacestd;
void gcd(int a, int b, int &d, int &x, int &y) {
if (!b) {
d = a;
x = 1;
y = 0;
}else {
gcd(b, a%b, d, y, x);
y -= x*(a/b); //***
}
}
int main() {
int a, b, d, x, y;
a = 6;
b = 15;
gcd(a, b, d, x ,y);
cout << x << " " << y << " " << d;
}
对于程序中加*号的地方,我的理解:
由参考文献可知,x1 = y2; y1 = x2 - a/b * y2; 因为经过了一步,gcd(b, a%b, d, y, x); 所以 此时的 y = x2; x = y2; 所以根据将 y1 公式翻过去就是 y = y - x *(a/b);
遇见这道题,对求最大公约数又有了新的认识欧几里得问题int gcd(int a, int b) { if (b == 0) return a; else return gcd(b, a%b);}扩展欧几里得问题对于ax + by = c; 在 c % gcd(a,b) = 0的时候,我们一般先求 a/gcd(a,b) x + b/gcd(