高效的最大公约数求解法

来源:互联网 发布:sql重复的行无法删除 编辑:程序博客网 时间:2024/05/02 05:44

综合利用辗转相除法,更相减损术和移位操作,达到最优解

 众所周知,移位运算的性能非常快。对于给定的正整数a和b,不难得到如下的结论。其中gcb(a,b)的意思是a,b的最大公约数函数:


当a和b均为偶数,gcb(a,b) = 2*gcb(a/2, b/2) = 2*gcb(a>>1, b>>1)


当a为偶数,b为奇数,gcb(a,b) = gcb(a/2, b) = gcb(a>>1, b)


当a为奇数,b为偶数,gcb(a,b) = gcb(a, b/2) = gcb(a, b>>1)


当a和b均为奇数,利用更相减损术运算一次,gcb(a,b) = gcb(b, a-b), 此时a-b必然是偶数,又可以继续进行移位运算。


比如计算10和25的最大公约数的步骤如下:


整数10通过移位,可以转换成求5和25的最大公约数
利用更相减损法,计算出25-5=20,转换成求5和20的最大公约数
整数20通过移位,可以转换成求5和10的最大公约数
整数10通过移位,可以转换成求5和5的最大公约数
利用更相减损法,因为两数相等,所以最大公约数是


//求解最大公约数

public class KgbTest
{


/**
* @param args
*/
public static void main(String[] args)
{

System.out.println(gcd(25,10));
}
public static int gcd(int a,int b)
{
if(a==b)return a;
else if(a<b)return gcd(b,a);
else
{
if((((a&1)==0))&&(((b&1)==0)))//判断两个数是否都为偶数,
{
return (gcd(a>>1,b>>1))<<1;
}
else if((((a&1)==0))&&(((b&1)==1)))//a为偶数
{
return  gcd(a>>1,b);
}
else if((((a&1)==1))&&(((b&1)==0))) //b为偶数
{
return  gcd(a,b>>1);
}
else//都是奇数
{
return gcd(b,a-b);
}
}
}


}

0 0