扩展欧几里得

#include <iostream>
#include <cstdio>

using namespace std;

/*
  扩展欧几里德算法,gcd(a,b) = a*x + b*y
  利用递归求解 gcd(a,b) 的过程,顺便求出系数 x y
  设:
      gcd(a,b)   = a*x  + b*y
      gcd(b,a%b) = b*x1 + (a%b)*y1
                 = b*x1 + (a-a/b*b)*y1
                 = a*y1 + b*(x1-a/b*y1)
  于是有:
      x = y1
      y = x1 - a/b*y1
  只需要在递归的过程中,解出子问题 :gcd(b,a%b) 的系数 x1 y1 就可以求出问题的 x y
*/
int ex_gcd(int a,int b,int *x,int *y)
{
    if(b==0)
    {
        *x=1;  //初始化
        *y=0;  //初始化
        return a;
    }
    int ans=ex_gcd(b,a%b,x,y);  //求解子问题的 gcd(b,a%b) 以及 x1 y1
    int temp=*x;
    *x=*y;  //计算 x
    *y=temp-*y*a/b;  //计算 y
    return ans;  //计算 gcd(a,b) = gcd(b,a%b)
}

int main()
{
    int a,b,x,y;
    while(scanf("%d%d",&a,&b)!=EOF)
    {
        int ans=ex_gcd(a,b,&x,&y);
        printf("gcd=%d x=%d y=%d\n",ans,x,y);
    }
    return 0;
}
利用扩展欧几里得,我们可以求出这样的式子: c = a * x + b * y 的系数 x y
可以把这个式子写成这样:
    c/gcd(a,b)*gcd(a,b) = a * x + b * y
再变形:
    c/gcd(a,b) = a/gcd(a,b) * x + b/gcd(a,b) * y
如果我们得到了:
    gcd(a,b) = a * x1 + b * y1
那么,我们就有了:
    x = c * x1 / gcd(a,b)
    y = c * y1 / gcd(a,b)
那么,问题就解决了


   

你可能感兴趣的:(c,算法,扩展,include)