二进制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算法需要用除法,这在某些嵌入式系统中可能排上用场。

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

public class GCD_Binary {
/**
* solve gcd using binary method
* @param u
* @param v
* @return gcd(u,v)
*/
public static int gcdBinary(int u,int v){
u=(u<)?-u:u;
v=(v<)?-v:v; if(u==)
return v;
if(v==)
return u; int k=;
while((u & 0x01)== && (v & 0x01) == ){
u>>=; //divide by 2
v>>=;
k++;
}
//at this time, there is at least one number is odd between m and n
int t=-v; //set it negative for later comparison of (t>0)
if((v & 0x01)==){
//v is odd
t = u;
}
//process t as a possible even number
while(t != ){
while((t & 0x01)==){
//do until t is not even
t>>=;
}
if(t>) //u > v (the max is replaced by |t|)
u=t;
else //u<v (the max is replaced by |t|)
v=-t;
//now u and v are all odd, then u-v is even
t = u-v;
}
return u*(<<k);
} public static void print(int m,int n,int gcd){
m = (m<)?-m:m;
n = (n<)?-n:n;
System.out.format("gcd of %d and %d is: %d%n",m,n,gcd);
} public static void main(String[] args) {
int m = -;
int n= ;
print(m,n,gcdBinary(m,n)); //co-prime
m = ;
n= ;
print(m,n,gcdBinary(m,n)); m = ;
n= ;
print(m,n,gcdBinary(m,n)); m = ;
n= ;
print(m,n,gcdBinary(m,n)); m = ;
n= ;
print(m,n,gcdBinary(m,n)); m = ;
n= ;
print(m,n,gcdBinary(m,n)); m = ;
n= ;
print(m,n,gcdBinary(m,n)); m = ;
n= ;
print(m,n,gcdBinary(m,n)); m = ;
n= ;
print(m,n,gcdBinary(m,n)); m = ;
n= ;
print(m,n,gcdBinary(m,n)); m = ;
n= ;
print(m,n,gcdBinary(m,n)); m = ;
n= ;
print(m,n,gcdBinary(m,n)); m = ;
n= ;
print(m,n,gcdBinary(m,n)); m = ;
n= ;
print(m,n,gcdBinary(m,n)); m = ;
n= ;
print(m,n,gcdBinary(m,n)); m = ;
n= ;
print(m,n,gcdBinary(m,n)); m = ;
n= ;
print(m,n,gcdBinary(m,n)); }
}

用二进制方法求两个整数的最大公约数(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. [LeetCode]题解(python):115-Distinct Subsequences

    题目来源: https://leetcode.com/problems/distinct-subsequences/ 题意分析: 给定字符串S和T,判断S中可以组成多少个T,T是S的子串. 题目思路: ...

  2. C# Convert an enum to other type of enum

    Sometimes, if we want to do convert between two enums, firstly, we may think about one way: var myGe ...

  3. 关于JVM的GC机制

    GC优点: 1.提高生产率,不用逐行检查内存是否释放. 2.Java安全策略的一部分,不会使用户错误释放内存而导致JVM崩溃. GC算法基本两点: 1.检测出垃圾对象. 2.回收垃圾对象,释放相应堆空 ...

  4. JS中的RegExp对象常用属性和方法

    JavaScript提供了一个RegExp对象来完成有关正则表达式的操作和功能,每一条正则表达式模式对应一个RegExp实例.有两种方式可以创建RegExp对象的实例. 使用RegExp的显式构造函数 ...

  5. Android之ListView性能优化

    ListView滚动速度优化主要可以应用以下几点方法来实现: 1.使用Adapter提供的convertView convertView是Adapter提供的视图缓存机制,当第一次显示数据的时候,ad ...

  6. Java中String、StringBuilder以及StringBuffer

    原文出处: 海子 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffe ...

  7. 对象图(Object Diagram)—UML图(三)

    一.用一张图来介绍一下对象图的基本内容 二.对象图与类图的基本差别 三.对象图实例

  8. JS获取DropDownList的value值与text值

    <script type="text/javascript" language="javascript"> function SearchChang ...

  9. U3D navmesh寻路简单示范

    要求:放置一个BOSS,创建几个路标,自动循环这几个路标形成回路,变成自动巡逻,并配合animator系统的控制开关控制BOSS的动作 1.先设置好BOSS 中animator的控制开关,只看Run和 ...

  10. 类似jquery的一个demo

    通过以下的demo,可以大体知道jquery的一些组织结构以及一些实现方法. 实际上jquery就是一个全局变量,只是在这个变量上添加了各种属性和方法. 首先我们要理解什么是匿名函数自执行,简单点就是 ...