本博文源于胡凡老师的《算法笔记》,当计算gcd(a,b)时,有 a x 1 + b y 1 = g c d a{x_1}+by_1=gcd ax1+by1=gcd成立,而在下一步计算gcd(b,a%b)时,又有 b x 2 + ( a % b ) y 2 = g c d bx_2+(a\%b)y2=gcd bx2+(a%b)y2=gcd成立,因此 a x 1 + b y 1 = b x 2 + ( a % b ) y 2 ax_1+by_1=bx_2+(a\%b)y_2 ax1+by1=bx2+(a%b)y2成立,又考虑到有关系 a % b = a − ( a / b ) ∗ b a\%b=a-(a/b)*b a%b=a−(a/b)∗b(此处除法为整除),因此 x 1 + b y 1 = b x 2 + ( a − ( a / b ) ∗ b ) y 2 x_1+by_1=bx_2+(a-(a/b)*b)y_2 x1+by1=bx2+(a−(a/b)∗b)y2成立,将等号右边的式子整理后可得 a x 1 + b y 1 = b ( x 2 − ( a / b ) ∗ b ) y 2 ax_1+by_1=b(x_2-(a/b)*b)y_2 ax1+by1=b(x2−(a/b)∗b)y2
完整源码
#include<iostream>
using namespace std;
int exGcd(int a, int b, int &x, int &y) {
//x和y使用引用
if(b==0){
x=1;
y = 0;
return a;
}
int g = exGcd(b,a%b,x,y);//递归计算exgcd(b,a%b);
int temp = x; //存放x的值
x = y; //更新x=y(old)
y = temp -a/b*y;//更新y=x(old)-a/b*y(old)
return g;
}
int main()
{
int a,b;
scanf("%d%d",&a,&b);
int x=0,y=0;
printf("%d*%d+%d*%d=%d",a,x,b,y,exGcd(a,b,x,y));
return 0;
}