- 浏览: 235125 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
cherami:
解法3有问题,在n很大的时候会导致baseNum溢出使得结果不 ...
阶乘算法之一N! 末尾有多少个零 -
yubenjie:
我怎么没看出多线程啊,就单线程再跑嘛
多线程编程之理财 -
fei229670104:
多线程 不错
多线程编程之理财 -
fei229670104:
liujiafei_2007 写道你好,问个问题,取钱时不用判 ...
多线程编程之存钱与取钱 -
liujiafei_2007:
你好,问个问题,取钱时不用判断取出的金额是否大于账户的余额吗? ...
多线程编程之存钱与取钱
解法一:
欧几里得算法 ( 又称辗转相除法 ) :
题:给定两个正整数 m 和 n ,求它们的最大公约子(即能得到同时整除 m 和 n 的最大正整数)
解:
E1.[ 求余数 ] 以 n 除 m 并令 r 为所得余数。(我们将有 0<<r<n )
E2.[ 余数为 0 ? ] 若 r=0 ,算法结束, n 即为答案
E3.[ 减少 ] 置 m<-n , n<-r ,并返回步骤 E1 。
算法示意图:
public int commonValue(int max,int min){ if(max<0|| min<0){ System.out.println("输入的两个参数必须为正整数。"); return -1; } if(max<min){ int temp = min; min = max; max = temp; } int remainder = max%min; while(remainder!=0){ max = min; min = remainder; remainder = max%min; } return min; }
引申题:
求两个线段长度的“最大公共量度” ,其中心思想就是求最大公约数
解法二:
解法一中,用到了取模运算。但对于大整数而言,取模运算(其中用到除法)是非常昂贵的开销,有没有办法能够不用取模运算呢?
分析:如果一个数能够同时整除 x 和 y(x > y) ,则必能同时整除 x-y 和 y; 即 x 和 y 的公约数与 x-y 和 y 的公约数是相同的,其最大公约数也是相同的,即 f(x,y)=f(x-y,y) ,那么就可以不再需要进行大整数的取模运算,而转换成简单得多的大整数的减法。
示例:
f(42,30)=f(30,12)=f(18,12)=f(12,6)=f(6,6)=f(6,0) = 6
public int cv(int max,int min){ if(max<min) return cv(min,max); if(min == 0) return max; else return cv(max-min,min); }
优点: 用减法代替除法,可以提高算法的效率。
缺点: 如果遇到 f(10 000 000 000 000,1) 这类情况(即两数值相差很大),本算法就不如算法一效率高。
解法三:
更相减损术: 是出自《九章算术》的一种求 最大公约数 的 算法 ,它原本是为 约分 而设计的,但它适用于任何需要求最大公约数的场合。
第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2 约简;若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2 与第二步中等数的乘积就是所求的最大公约数。
该算法的思想是用 2 约简,该算法相比算法二效率有所提高, 那能不能进一步改进算法,想一想该算法只是在两个整数都为偶数的时候用 2 约简,当一个为偶数,一个有奇数时能约简吗?
private int count = 0; //计数器,标记用2约简的次数 public int cv2(int max,int min){ if(max<min) return cv2(min,max); if(isEven(max)&&isEven(min)){ count++; return cv2(max>>1,min>>1); } if(min == max-min){ while(count-->0){ min = min<<1; } return min; } else return cv2(max-min,min); } //函数--判断是否是偶数 public boolean isEven(int i){ if((i&1) == 0) return true; return false; }
解法四:
对于 y 和 x 来说,如果 y = k*y, x = k*x1 。那么有 f(y,x)=k*f(y1 ,x1 ) 。另外,如果 x = p*x1 , 假设 p 是素数,并且 y%p!=0( 即 y 不能被 p 整除 ) ,那么 f(x,y)=f(p*x1, y)=f(x1, y) 。
同样的为了便于提高运算效率,采用 2 这个素数(乘除运算便于转化成位移运算)。
取 p = 2
若 x,y 均为偶数, f(x,y)=2*f(x/2,y/2)=2*f(x>>1,y>>1)
若 x 为偶数, y 为奇数 ,f(x,y)=f(x/2,y)=f(x>>1,y)
若 x 为奇数, y 为偶数 ,f(x,y)=f(y,x-y) ,
那么在 f(x,y)=f(y,x-y) 之后, (x-y) 是一个偶数,下一步定会有除以 2 的操作(即两奇数相减得偶数)。
最坏情况下的时间复杂度是 O(log2 (max(x,y))) 。
f(42,30)=f(42/2,30/2)
=2 * f(21,15)
=2 * f(15,21-15)
=2 * f(15,6)
=2 * f(15,6/2)
=2 * f(15,3)
=2 * f(15-3,3)
=2 * f(12,3)
=2 * f(12/2,3)
=2 * f(6,3)
=2 * f(6/2,3)
=2 * f(3,3)
=2 * f(3,0)
=2*3
=6
public int cv(int max,int min){ if(max<min) return cv(min,max); if(min==0){ return max; }else{ if(isEven(max)){ if(isEven(min)) return (cv(max>>1,min>>1)<<1); else return cv(max>>1,min); }else{ if(isEven(min)) return cv(max,min>>1); else return cv(min,max-min); } } }//函数--判断是否是偶数 public boolean isEven(int i){ if((i&1) == 0) return true; return false; }
发表评论
-
Enum的深入浅出
2015-06-18 09:34 1476还记得上一篇是如何运用Enum来定义一周的的吗? ... -
JAVA中的Enum
2015-06-17 14:41 1387Enum是计算机编程语言中的一种数据类型---枚举类型。在实 ... -
多线程篇之二JAVA多线程之概念篇
2014-02-24 16:10 1660一:JAVA中的线程 在java中线程的应用类主 ... -
多线程篇之一 概念与原理
2014-02-24 15:47 1893一:线程 线程(英语:thread)是操作系统能够进行运 ... -
JAVA深入浅出流之二字节流
2014-01-14 13:59 2471在《 ... -
JAVA深入浅出流之一IO流
2014-01-14 11:39 4912工作三年了,可自己对文件读写还是一知半解,写代码的时候都不 ... -
JAVA Annotation之定义篇
2013-12-15 14:38 1889Annotation: 译为注释或注解 An a ... -
阶乘算法之一N! 末尾有多少个零
2013-06-07 16:32 7930... -
算法之时间复杂度
2013-06-07 15:11 3066在计算机科学中,算法的时间复杂度是一个函数,它定量描 ... -
JAVA 静态变量与非静态变量初始化顺序之新解
2012-12-28 16:43 3926今天和同事争论一问题,关于静态变量与非静态变量的初始化顺序,谁 ... -
求二进制数中1的个数
2012-08-21 09:56 7868解法一: 对于一个正整数如果是偶数,该数的二 ... -
《编程之美》--中国象棋将帅问题
2012-07-20 14:16 2847最近在看微软研究院出版的《编程之美》一书,对于该书中提到的一些 ... -
java 位移运算与乘法运算
2012-07-09 14:25 5466对于 JAVA 编程中,适当的采用位移运算,会减少代 ... -
Java 求素数运算
2012-06-26 16:06 2285网络上对求素数之解数不胜数,我在此总结归纳一下,同时对一些编码 ... -
JAVA海量数据处理之二(BitMap)
2012-06-20 18:07 12108路漫漫其修远兮,吾将上下而求索。想要更快 ... -
海量数据处理之一
2012-06-18 18:37 2839... -
HTTP 协议通信
2012-01-18 18:11 1851一:简介 ... -
Java 字节码之解析一
2011-12-01 15:20 5042一: J ... -
Java常用工具--jps
2011-10-30 18:24 2036jps-虚拟 ... -
Map 与 JavaBean之间的转换
2011-10-26 19:55 3540最近项目里需要一个工具类,它的功能是传入一个Map后 ...
相关推荐
有关c++求最大公约数的代码,用的是辗转相除法,很简单的算法过程,主要是求最大公约数
在这个特定的项目中,我们关注的是如何使用Verilog来实现一个计算两个数最大公约数(Greatest Common Divisor, GCD)的功能。 最大公约数是指能同时整除两个或两个以上整数的最大正整数。求解最大公约数有多种方法...
根据给定的信息,我们可以提取并总结出以下与“用辗转相除法求最大公约数”相关的知识点: ### 1. 辗转相除法(欧几里得算法)原理 辗转相除法是一种用于计算两个正整数最大公约数(Greatest Common Divisor, GCD...
python求最大公约数和最小公倍数 #辗转相除法 def gcd(a,b): #最大公约数函数,且最小公倍数 = 两个数相乘 / 最大公约数 if b == 0: return a else: return gcd(b,a%b) print("请输入两个数:") j,k = input()....
用LabVIEW求最大公约数和最小公倍数。可以自行选择数据。
根据提供的文件信息,本文将详细解释如何使用C语言来实现最大公约数(Greatest Common Divisor, GCD)和最小公倍数(Least Common Multiple, LCM)的计算。 ### 最大公约数(GCD) #### 概念 最大公约数是指两个...
基于FPGA开发板的两位数求最大公约数和最小公倍数的设计,该设计中利用辗转相减法求得公约数与公倍数,且两个数的数值可通过按键修改,设计灵活可靠。该设计基于vivado开发,并带有testbench文件,方便仿真学习。
这个是用递归法来写最大公约数,当然原算法还是欧几里得算法;只不过代码比较简洁
C语言编写利用程序递归求最大公约数,递归调用被继承的基类成员函数
辗转相除法,又称欧几里得算法,是最古老的求解最大公约数的方法之一。其基本思想是:对于任意两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c与b之间的最大公约数。可以表示为GCD(a, b) = GCD(b, a % b)...
欧几里得算法,也称为辗转相除法,是计算两个正整数最大公约数(Greatest Common Divisor, GCD)的一种经典方法。该算法基于以下原理:两个正整数a和b(a>b)的最大公约数等于a除以b的余数c和b之间的最大公约数。...
根据给定的文件信息,我们可以总结出以下关于“求最大公约数”的相关知识点: ### 一、最大公约数(GCD)概念 最大公约数,也称为最大公因数,是指两个或多个整数共有约数中最大的一个。例如,数字8和12的公约数有...
在计算机科学和编程领域,求解最大公约数(Greatest Common Divisor,GCD)是一项基本的任务,它在数学和算法设计中具有广泛的应用。本文将深入探讨三种不同的方法来计算两个整数的最大公约数:分解质因数法、连续...
欧几里得算法是求两个正整数最大公约数的最古老且最有效的方法之一。其基本思想是:对于任何两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数。数学表达式为:GCD(a, b) = GCD(b, a ...
C语言求最大公约数和最小公倍数算法总结 C语言中求最大公约数和最小公倍数的各种算法总结,包括辗转相除法和穷举法等。辗转相除法又名欧几里德法,是一种经典的算法,用于计算两个正整数的最大公约数和最小公倍数。...
### 对求最大公约数进行白盒测试的知识点详解 #### 实验目的 - **掌握静态白盒测试方法及一般要求**:了解如何通过分析源代码结构来发现软件缺陷,包括但不限于代码审查、符号执行等技术。 - **掌握白盒测试用例的...
标题“例3-16求最大公约数.zip”暗示了一个编程示例,旨在实现计算两个或更多整数之间最大公约数(Greatest Common Divisor, GCD)的功能。这个压缩包可能包含一个C++项目或者任何其他编程语言的源代码,如Python、...
VB求最大公约数和最小公倍数 VB语言是Microsoft公司开发的一种高级编程语言,广泛应用于Windows操作系统平台上的应用程序开发。VB语言具有简单易学、开发效率高、应用广泛等特点,深受广大开发者的喜爱。在VB语言中...
2.编写两个函数,分别求两个整数的最大公约数和最小公倍数