更详细的解释,这个博主的文章在这:http://m.blog.csdn.net/article/details?id=8271123。
大概原理就是,找到一份满足a,b的最小公约数的解 即ax+by=gcd(a,b),然后在根据需要把
c的值进行放大与缩小
(a*c)x+(b*c)y=gcd(a,b)*c gcd(a,b)*c即需要求得的值。
一份gcd求得的x,y最小值c++代码:
#include<bits/stdc++.h>
using namespace std;
int x,y;
int gcd(int a,int b)//一个函数,返回gcd(a,b)
{
if(b==0)
{
x=1;y=0;//边界时候的赋值
return a;
}
else{
int ans=gcd(b,a%b);
int t=x;x=y;//这一句和后一句就是刚才推到的求法
y=t-a/b*y;
return ans;
}
}
int main(int argc, char const *argv[])
{
int a,b;
scanf("%d%d",&a,&b);
int ans=gcd(a,b);
printf("%d\n",ans);
printf("%d %d",x,y);
return 0;
}```
一份优化处理之后,求x是正整数的代码:
```
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int kzgcd(int a,int b,int &x,int &y){
if(b==0){ x=1,y=0; return a; }
int res = kzgcd(b,a%b,y,x);
y -= a/b*x;
return res;
}
int main(){
int n,m;
while(cin>>n>>m){
int x,y;
int flag=kzgcd(n,m,x,y);
if(flag!=1) {
printf("sorry\n");
continue;
}
while(x<0){ 对解的要求 a(x+b)+b(x-a)=c
x += m; 注意解的转化
y -= n;
}
printf("%d %d\n",x,y);
}
}