#include <iostream>
#include <cstdio>
#define maxn 1000
#define INF 0xfffffff
using namespace std;
int m = 0, n = 0;
int gcd = 0;
int x[maxn], y[maxn], q[maxn];
void extend_gcd(){
x[1] = 1;
y[1] = -q[0];
x[2] = -q[1];
y[2] = 1+q[0]*q[1];
for(int i = 2; i < INF; i++){
x[i+1] = x[i-1] - q[i]*x[i];
y[i+1] = y[i-1] - q[i]*y[i];
if(gcd == m*x[i+1] + n*y[i+1]){
printf("m = %d, n = %d\n", m, n);
printf("%d = %d*(%d) + %d*(%d)\n", gcd, m, x[i+1], n, y[i+1]);
break;
}
}
}
int init(){
int r = 1, i = 0, t;
int a = m, b = n;
memset(x, 0, sizeof(x));
memset(y, 0, sizeof(y));
memset(q, 0, sizeof(q));
while(r){
r = a%b;
t = a/b;
q[i++] = t;
a = b;
b = r;
}
return a;
}
int main()
{
int temp;
while(scanf("%d%d", &m, &n)!=EOF){
if(m < n) { temp = m, m = n, n = temp; }
gcd = init();
if(m && n){//此处只是考虑都不为零的情况。
extend_gcd();
}
}
return 0;
}
扩展欧几里得(递推实现)
最新推荐文章于 2021-05-12 09:35:20 发布