二进制GCD算法基本原理是:
 先用移位的方式对两个数除2,直到两个数不同时为偶数。然后将剩下的偶数(如果有的话)做同样的操作,这样做的原因是如果u和v中u为偶数,v为奇数,则有gcd(u,v)=gcd(u/2,v)。到这时,两个数都是奇数,将两个数相减(因为gcd(u,v) = gcd(u-v,v)),得到的是偶数t,对t也移位直到t为奇数。每次将最大的数用t替换。

二进制GCD算法优点是只需用减法和二进制移位运算,不像Euclid's算法需要用除法,这在某些嵌入式系统中可能排上用场。

本例实现参考了<<计算机编程的艺术>>第二卷中介绍的算法。

  1. public class GCD_Binary {
  2. /**
  3. * solve gcd using binary method
  4. * @param u
  5. * @param v
  6. * @return gcd(u,v)
  7. */
  8. public static int gcdBinary(int u,int v){
  9. u=(u<)?-u:u;
  10. v=(v<)?-v:v;
  11.  
  12. if(u==)
  13. return v;
  14. if(v==)
  15. return u;
  16.  
  17. int k=;
  18. while((u & 0x01)== && (v & 0x01) == ){
  19. u>>=; //divide by 2
  20. v>>=;
  21. k++;
  22. }
  23. //at this time, there is at least one number is odd between m and n
  24. int t=-v; //set it negative for later comparison of (t>0)
  25. if((v & 0x01)==){
  26. //v is odd
  27. t = u;
  28. }
  29. //process t as a possible even number
  30. while(t != ){
  31. while((t & 0x01)==){
  32. //do until t is not even
  33. t>>=;
  34. }
  35. if(t>) //u > v (the max is replaced by |t|)
  36. u=t;
  37. else //u<v (the max is replaced by |t|)
  38. v=-t;
  39. //now u and v are all odd, then u-v is even
  40. t = u-v;
  41. }
  42. return u*(<<k);
  43. }
  44.  
  45. public static void print(int m,int n,int gcd){
  46. m = (m<)?-m:m;
  47. n = (n<)?-n:n;
  48. System.out.format("gcd of %d and %d is: %d%n",m,n,gcd);
  49. }
  50.  
  51. public static void main(String[] args) {
  52. int m = -;
  53. int n= ;
  54. print(m,n,gcdBinary(m,n));
  55.  
  56. //co-prime
  57. m = ;
  58. n= ;
  59. print(m,n,gcdBinary(m,n));
  60.  
  61. m = ;
  62. n= ;
  63. print(m,n,gcdBinary(m,n));
  64.  
  65. m = ;
  66. n= ;
  67. print(m,n,gcdBinary(m,n));
  68.  
  69. m = ;
  70. n= ;
  71. print(m,n,gcdBinary(m,n));
  72.  
  73. m = ;
  74. n= ;
  75. print(m,n,gcdBinary(m,n));
  76.  
  77. m = ;
  78. n= ;
  79. print(m,n,gcdBinary(m,n));
  80.  
  81. m = ;
  82. n= ;
  83. print(m,n,gcdBinary(m,n));
  84.  
  85. m = ;
  86. n= ;
  87. print(m,n,gcdBinary(m,n));
  88.  
  89. m = ;
  90. n= ;
  91. print(m,n,gcdBinary(m,n));
  92.  
  93. m = ;
  94. n= ;
  95. print(m,n,gcdBinary(m,n));
  96.  
  97. m = ;
  98. n= ;
  99. print(m,n,gcdBinary(m,n));
  100.  
  101. m = ;
  102. n= ;
  103. print(m,n,gcdBinary(m,n));
  104.  
  105. m = ;
  106. n= ;
  107. print(m,n,gcdBinary(m,n));
  108.  
  109. m = ;
  110. n= ;
  111. print(m,n,gcdBinary(m,n));
  112.  
  113. m = ;
  114. n= ;
  115. print(m,n,gcdBinary(m,n));
  116.  
  117. m = ;
  118. n= ;
  119. print(m,n,gcdBinary(m,n));
  120.  
  121. }
  122. }

用二进制方法求两个整数的最大公约数(GCD)的更多相关文章

  1. c 求两个整数的最大公约数和最小公倍数

    //求最大公约数是用辗转相除法,最小公倍数是根据公式 m,n 的 最大公约数* m,n最小公倍数 = m*n 来计算 #include<stdio.h> //将两个整数升序排列 void ...

  2. 求两个整数的最大公约数GCM

    思路分析: (1)求差判定法:  如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数 ...

  3. 【C语言】写一个函数,并调用该函数求两个整数的最大公约数和最小公倍数

    程序分析: 在数学中,两个数的最小公倍数=两个数的乘积/两数的最大公约数. 求两个数的最大公约数,运用辗转相除法:已知两个整数M和N,假定M>N,则求M%N. 如果余数为0,则N即为所求:如果余 ...

  4. java 利用辗除法求两个整数的最大公约数和最小公倍数

    题目:输入两个正整数m和n,求其最大公约数和最小公倍数. 程序分析:利用辗除法. package Studytest; import java.util.Scanner; public class P ...

  5. 《Advanced Bash-scripting Guide》学习(十九):两个整数的最大公约数

    本文所选的例子来自于<Advanced Bash-scripting Gudie>一书,译者 杨春敏 黄毅 #!/bin/bash #求两个整数的最大公约数 E_BADARGS= #如果参 ...

  6. 《剑指offer》写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

    弱菜刷题还是刷中文题好了,没必要和英文过不去,现在的重点是基本代码能力的恢复. [题目] 剑指offer 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. [思路] 直觉 ...

  7. 给定一个正整数,实现一个方法求出离该整数最近的大于自身的 换位数 <把一个整数各个数位进行全排列>

    """给定一个正整数,实现一个方法求出离该整数最近的大于自身的 换位数 -> 把一个整数各个数位进行全排列""" # 使用 permu ...

  8. 【转载】 C#使用Union方法求两个List集合的并集数据

    在C#语言的编程开发中,有时候需要对List集合数据进行运算,如对两个List集合进行交集运算或者并集运算,其中针对2个List集合的并集运算,可以使用Union方法来快速实现,Union方法的调用格 ...

  9. php取两个整数的最大公约数算法大全

    php计算两个整数的最大公约数常用算法 <?php//计时,返回秒function microtime_float (){ list( $usec , $sec ) = explode ( &q ...

随机推荐

  1. javascript的isPrototypeOf函数的理解

    JavaScript中isPrototypeOf函数方法是返回一个布尔值,指出对象是否存在于另一个对象的原型链中.使用方法: object1.isPrototypeOf(object2)~~~原型链理 ...

  2. (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单

    原文 (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单 接上一节:(C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开这 ...

  3. perl5 第十三章 Perl的面向对象编程

    第十三章 Perl的面向对象编程 by flamephoenix 一.模块简介二.Perl中的类三.创建类四.构造函数 实例变量 五.方法六.方法的输出七.方法的调用八.重载九.析构函数十.继承十一. ...

  4. 技术不牛如何才拿到国内IT巨头的Offer

    不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人,NOI金牌,开源社区名人,三年级开始写Basic...在跪拜之余我们不禁要想,和这些牛人比,作为绝大部分技 ...

  5. POCO C++ lib开发环境构建

    Welcome Thank you for downloading the POCO C++ Libraries and welcome to the growing community of POC ...

  6. 关于QT中evaluateJavaScript()函数返回值的处理问题

    关于QT中evaluateJavaScript()函数返回值的处理问题 - 寒风问雪的专栏 - 博客频道 - CSDN.NET 关于QT中evaluateJavaScript()函数返回值的处理问题 ...

  7. 自己定义View----点击滑动选择字母列表

    因为项目须要,也不想使用网上的写好的控件,于是作死的自己定义了一个控件.特此记录下成功.效果例如以下: 首先须要把全部的字母绘制出来: private static String letters[] ...

  8. Zookeeper 在Hadoop中的应用

    Zookeeper 简单介绍 Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目.它主要是用来解决分布式应用中常常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集 ...

  9. CRC32 vs Java.HashCode

    找了容量为27万中文词库进行试验    CRC32 中冲突率 < 0.01%    而 Java.HashCode 有 4%    hashCode 的速度 应该比 CRC 快 2-3 倍 CR ...

  10. SharePoint2013切换账户身份登录设置

    1. 打开Welcome.ascx文件:C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\TEMPLATE ...