gcd的二进制优化笔记

可将x,y分为六种情况进行讨论:

  1. 若x=0或y=0:返回y或x;
  2. 若x<y:交换x,y;
  3. 若x为偶数且y为偶数:gcd(x/2,y/2);
  4. 若x为偶数且y为奇数:gcd(x/2,y);
  5. 若x为奇数且y为偶数:gcd(x,y/2);
  6. 若x为奇数且y为奇数:gcd(x-y,y);

代码如下:

inline int gcd(int x,int y)

{

    int n=0,m=0;

    while(!(x&1)) ++n,x>>=1;

    while(!(y&1)) ++m,y>>=1;

    //排除之后全偶的情况

    n=min(n,m);

    while(1)

    {

         if(x<y) swap(x,y);

         if(!(x-=y)) return y<<n;

         while(!(x&1)) x>>=1;

    }

猜你喜欢

转载自www.cnblogs.com/ljk123-de-bo-ke/p/10680171.html