解法一: 直接用代码来实现辗转相除。利用递归就能够很轻松的把这个问题完成
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. 辗转相除法适用比较广,比短除法要好得多,它能保证求出任意两个数的最大公约数.