#include#include <string.h> #include using namespace std; //扩展欧几里得算法 //返回a、b的最大公约数 //求得的x、y是 a*x+b*y=gcd(a,b) 的一个特解 int exgcd(int a,int b,int& x,int& y){ if(b == 0){ x = 1; y = 0; return a; } int r = exgcd(b,a%b,x,y); int z = x; x = y; y = z - a/b*y; return r; } int main() { int a,b; int x=0; int y=0; cin>>a>>b; int r = exgcd(a,b,x,y); cout << a << "*" << x << "+" << b << "*" << y << "=" << r << endl; return 0; }
设 X,Y 是 a*x+b*y=gcd(a,b)的通解则
X = x + b/gcd(a,b)*t;
Y = y - a/gcd(a,b)*t;
其中 x,y 是方程的一个特解,gcd(a,b)为a、b的最大公约数
证明:
推广:
对于方程 a*x + b*y = c
可以先求 a*x = b*y = gcd(a,b)的特解 x0,y0
然后可推出 a*x + b*y = c 的一个特解(x,y)为: x = x0*c/gcd(a,b) y = y0*c/gcd(a,b)
进一步可推出方程 a*x + b*y = c 的通解(X,Y)如下
代码:
#include#include <string.h> #include using namespace std; //扩展欧几里得算法 //返回a、b的最大公约数 //求得的x、y是 a*x+b*y=gcd(a,b) 的一个特解 int exgcd(int a,int b,int& x,int& y){ if(b == 0){ x = 1; y = 0; return a; } int r = exgcd(b,a%b,x,y); int z = x; x = y; y = z - a/b*y; return r; } int main() { int a,b,c,x,y; cin>>a>>b>>c; //求出a*x+b*y=gcd(a,b)的一个特解并赋值给x,y; int r = exgcd(a,b,x,y); // r 为 a、b的最大公约数 //求出a*x+b*y=c的一个特解并赋值给x,y; x = x*c/r; //从这里可以看出 a*x + b*y = c 有解的条件是 c能被gcd(a,b)整除 y = y*c/r; //根据通解公式输出100个解 for(int t = 1;t<=100;t++){ int X,Y; X = x + b/r*t; Y = y - a/r*t; cout << a << "*" << X << "+" << b << "*" << Y << "=" << c << endl; } return 0; }