用二进制方法求两个整数的最大公约数(GCD)
二进制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)的更多相关文章
- c 求两个整数的最大公约数和最小公倍数
//求最大公约数是用辗转相除法,最小公倍数是根据公式 m,n 的 最大公约数* m,n最小公倍数 = m*n 来计算 #include<stdio.h> //将两个整数升序排列 void ...
- 求两个整数的最大公约数GCM
思路分析: (1)求差判定法: 如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数 ...
- 【C语言】写一个函数,并调用该函数求两个整数的最大公约数和最小公倍数
程序分析: 在数学中,两个数的最小公倍数=两个数的乘积/两数的最大公约数. 求两个数的最大公约数,运用辗转相除法:已知两个整数M和N,假定M>N,则求M%N. 如果余数为0,则N即为所求:如果余 ...
- java 利用辗除法求两个整数的最大公约数和最小公倍数
题目:输入两个正整数m和n,求其最大公约数和最小公倍数. 程序分析:利用辗除法. package Studytest; import java.util.Scanner; public class P ...
- 《Advanced Bash-scripting Guide》学习(十九):两个整数的最大公约数
本文所选的例子来自于<Advanced Bash-scripting Gudie>一书,译者 杨春敏 黄毅 #!/bin/bash #求两个整数的最大公约数 E_BADARGS= #如果参 ...
- 《剑指offer》写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
弱菜刷题还是刷中文题好了,没必要和英文过不去,现在的重点是基本代码能力的恢复. [题目] 剑指offer 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. [思路] 直觉 ...
- 给定一个正整数,实现一个方法求出离该整数最近的大于自身的 换位数 <把一个整数各个数位进行全排列>
"""给定一个正整数,实现一个方法求出离该整数最近的大于自身的 换位数 -> 把一个整数各个数位进行全排列""" # 使用 permu ...
- 【转载】 C#使用Union方法求两个List集合的并集数据
在C#语言的编程开发中,有时候需要对List集合数据进行运算,如对两个List集合进行交集运算或者并集运算,其中针对2个List集合的并集运算,可以使用Union方法来快速实现,Union方法的调用格 ...
- php取两个整数的最大公约数算法大全
php计算两个整数的最大公约数常用算法 <?php//计时,返回秒function microtime_float (){ list( $usec , $sec ) = explode ( &q ...
随机推荐
- javascript的isPrototypeOf函数的理解
JavaScript中isPrototypeOf函数方法是返回一个布尔值,指出对象是否存在于另一个对象的原型链中.使用方法: object1.isPrototypeOf(object2)~~~原型链理 ...
- (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单
原文 (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单 接上一节:(C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开这 ...
- perl5 第十三章 Perl的面向对象编程
第十三章 Perl的面向对象编程 by flamephoenix 一.模块简介二.Perl中的类三.创建类四.构造函数 实例变量 五.方法六.方法的输出七.方法的调用八.重载九.析构函数十.继承十一. ...
- 技术不牛如何才拿到国内IT巨头的Offer
不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人,NOI金牌,开源社区名人,三年级开始写Basic...在跪拜之余我们不禁要想,和这些牛人比,作为绝大部分技 ...
- POCO C++ lib开发环境构建
Welcome Thank you for downloading the POCO C++ Libraries and welcome to the growing community of POC ...
- 关于QT中evaluateJavaScript()函数返回值的处理问题
关于QT中evaluateJavaScript()函数返回值的处理问题 - 寒风问雪的专栏 - 博客频道 - CSDN.NET 关于QT中evaluateJavaScript()函数返回值的处理问题 ...
- 自己定义View----点击滑动选择字母列表
因为项目须要,也不想使用网上的写好的控件,于是作死的自己定义了一个控件.特此记录下成功.效果例如以下: 首先须要把全部的字母绘制出来: private static String letters[] ...
- Zookeeper 在Hadoop中的应用
Zookeeper 简单介绍 Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目.它主要是用来解决分布式应用中常常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集 ...
- CRC32 vs Java.HashCode
找了容量为27万中文词库进行试验 CRC32 中冲突率 < 0.01% 而 Java.HashCode 有 4% hashCode 的速度 应该比 CRC 快 2-3 倍 CR ...
- SharePoint2013切换账户身份登录设置
1. 打开Welcome.ascx文件:C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\TEMPLATE ...