高效的最大公约数求解法
来源:互联网 发布: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);
}
}
}
}
- 高效的最大公约数求解法
- 求最大公约数的不同解法
- 求最大公约数和最小公倍数的常用解法
- 求幂计算的高效解法
- 质因数分解法求最大公约数
- 黑马程序员——求两个字符串最大公约数的解法
- 最大公约数的递归解法
- 求大数的最大公约数的最高效方法
- 求最大公约数和最小公倍数的最简单 高效的算法
- 高效的最大公约数算法
- 最大公约数问题的优化解法
- 《编程之美》求两个大整数的最大公约数问题的一般解法
- 求最大公约数的两种解法(欧几里得算法和素数分解)
- POJ2965的枚举解法和高效解法
- 求最大公约数的函数
- 求最大公约数的算法
- 求最大公约数的算法
- 求最大公约数的算法
- 点击两次退出程序
- 第七周 负数把正数赶出队列
- 微服务框架Spring Cloud介绍 Part3: Mysteam项目结构与开发用户注册服务
- Android app的文件目录
- 欢迎访问我的主页zhangdanyang.com
- 高效的最大公约数求解法
- 如何利用Caffe训练ImageNet分类网络
- 在线编程--全排列
- 组件使用component
- 儿子选择器 >
- 7.Operators Categories - 按目录分类的主要操作符列表
- linux 命令复制
- 重阳是最美的节日
- 算法导论---逆序对 p24题,2-4