(UVA - 10104 Euclid Problem)
1.题意
题目要求输入两个正整数a和b,要求输出满足ax+by = d(其中d为a与b的最大公约数)这个式子对应的x和y的解。
2.解题思路
这道题直接利用扩展欧几里得算法的模板代码就可以解决。
我们回顾一下欧几里得算法:
int gcd(int a,int b)
{
if(!b)return a;
return gcd(b,a%b);
}
扩展欧几里得:
int ext-gcd(int a,int b,int &x,int &y)
{
if(!b){
x=1;
y=0;
return a;
}
int d=gcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
3.题目代码
#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int a,int b)
{
if(!b)return a;
return gcd(b,a%b);
}
int exct_gcd(int a,int b,int& x,int& y)
{
if(!b)
{
x=1;
y=0;
return a;
}
int d=exct_gcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main(){
int a,b;
while(cin>>a>>b)
{
int x=0,y=0;
int d=exct_gcd(a,b,x,y);
cout<<x<<" "<<y<<" "<<d<<endl;
}
}