扩展欧几里得算法

点击查看代码
#include<cstdio>
#pragma warning(disable:4996)

//给定a、b,通过欧几里得算法求解a和b的最大公约数gcd(a,b)
int gcd(int a, int b) {
	if (b == 0) return a;
	else return gcd(b, a % b);
}

//给定a、b,通过扩展欧几里得算法求解ax+by=gcd(a,b)的x和y
int exgcd(int a, int b, int& x, int& y) { //求解x和y用引用型
	//根据欧几里得算法,当b为0时,(x,y)=(1,0),返回a
	if (b == 0) { 
		x = 1; y = 0; return a;
	}
	//g存储a和b的最大公约数。当b不为0时,将(a,b)改为(b,a%b)进行递归计算
	int g = exgcd(b, a % b, x, y);
	int temp = x; //用temp存放底层x的值,temp=x(old)
	x = y; //将上层x更新为底层y的值,x=y(old)
	y = temp - a / b * y; //将上层y更新为y=x(old)-a/b*y(old)
	return g; //g是最大公约数
}

posted @ 2022-09-29 21:06  zhaoo_o  阅读(1)  评论(0编辑  收藏  举报