最大公约数的问题 编程之美p150

解法一: 直接用代码来实现辗转相除。利用递归就能够很轻松的把这个问题完成

int ged(int x,int y){ return (!y)>x:gcd(y,x%y); }

(对于大整数而言,取模运算--其中运用到除法,是非常昂贵的开销,瓶颈)

解法二: 分析:如果一个数能够同时整除x和y,则必能同时整除x-y和y;数能够同时整除x-y和y,也必能同时整除x和y.

BigInt gcd(BigInt x,BigInt y)

{ if(x>1,y>>1) 若x为偶数,y为奇数,

f(x,y)=f(x/2,y)=f(x>>1,y) 若x为奇数,y为偶数,

f(x,y)=f(x,y/2)=f(x,y>>1) 若x,y均为奇数.f(x,y)=f(x,x-y) 那么在f(x,y)=f(x,x-y)之后,(x-y)是一个偶数,

下一步一定会有除以2的操作 最坏的情况就是时间复杂度O(log2(max(x,y)))

例子:

f(42,30)

=f(101010,11110)

=2*f(10101,1111)

=2*f(1111,110)

=2*f(1111,11)

=2*f(1100,11)

=2*f(11,11)

=2*f(0,11)

=2*11

=6

 

BigInt gcd(BigInt x,BigInt y)

{ if(x>1,Y>>1)<<1);

else return gcd(x>>1,y); }

else{

if(IsEven(y)) return gcd(x,Y>>1);

else return gcd(y,x-y); } } }

(利用移位运算和减法运算,避开了大整数除法,提高了运算的效率。)

--------------------------------------扩展知识 最大公约数九法

湖南省武冈市教研室周定武   

一、观察法.   运用能被2、3、5整除的数的特征进行观察.   例如,求225和105的最大公约数.因为225、105都能被3和5整除,所以225和105至少含有公约数(3×5)15.因为225÷15=15,105÷15=7.15与7互质,所以225和105的最大公约数是15.

 

 二、查找约数法. 先分别找出每个数的所有约数,再从两个数的约数中找出公有的约数,其中最大的一个就是最大公约数.   例如,求12和30的最大公约数. 12的约数有:1、2、3、4、6、12; 30的约数有:1、2、3、5、6、10、15、30. 12和30的公约数有:1、2、3、6,其中6就是12和30的最大公约数.  

 

 三、分解因式法.   先分别把两个数分解质因数,再找出它们全部公有的质因数,然后把这些公有质因数相乘,得到的积就是这两个数的最大公约数.   例如:求125和300的最大公约数.因为125=5×5×5,300=2×2×3×5×5,所以125和300的最大公约数是5×5=25.   

 

四、关系判断法.   当两个数关系特殊时,可直接判断两个数的最大公约数.例如,两个数互质时,它们的最大公约数就是这两个数的乘积;两个数成倍数关系时,它们的最大公约数就是其中较小的那个数.

 

  五、短除法.   为了简便,将两个数的分解过程用同一个短除法来表示,那么最大公约数就是所有除数的乘积.   例如:求180和324的最大公约数.   因为:   5和9互质,所以180和324的最大公约数是4×9=36.   

 

六、除法法.   当两个数中较小的数是质数时,可采用除法求解.即用较大的数除以较小的数,如果能够整除,则较小的数是这两个数的最大公约数.   例如:求19和152,13和273的最大公约数.因为152÷19=8,273÷13=21.(19和13都是质数.)所以19和152的最大公约数是19,13和273的最大公约数是13.   

 

七、缩倍法.   如果两个数没有之间没有倍数关系,可以把较小的数依次除以2、3、4……直到求得的商是较大数的约数为止,这时的商就是两个数的最大公约数.例如:求30和24的最大公约数.24÷4=6,6是30的约数,所以30和24的最大公约数是6.   

 

八、求差判定法.   如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数是6,所以78和60的最大公约数是6.    如果两个数相差较大,可以用大数减去小数的若干倍,一直减到差比小数小为止,差和小数的最大公约数就是原来两数的最大公约数.例如:求92和16的最大公约数.92-16=76,76-16=60,60-16=44,44-16=28,28-16=12,12和16的最大公约数是4,所以92和16的最大公约数就是4.   

 

九、辗转相除法.   当两个数都较大时,采用辗转相除法比较方便.其方法是:   以小数除大数,如果能整除,那么小数就是所求的最大公约数.否则就用余数来除刚才的除数;再用这新除法的余数去除刚才的余数.依此类推,直到一个除法能够整除,这时作为除数的数就是所求的最大公约数.   例如:求4453和5767的最大公约数时,可作如下除法.   5767÷4453=1余1314   4453÷1314=3余511   1314÷511=2余292   511÷292=1余219   292÷219=1余73   219÷73=3   于是得知,5767和4453的最大公约数是73.   辗转相除法适用比较广,比短除法要好得多,它能保证求出任意两个数的最大公约数.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值