求最大公约数

来源:互联网 发布:医院 数据库 编辑:程序博客网 时间:2024/05/05 17:39

求两个数的最大公约数,你有几种方法?

 

 

辗转相除法:

原理:设f(x,y)表示x,y的最大公约数,取k=x/y,b=x%y,那么x=ky+b。由此可得,如果一个数可以整除x和y,那么也可以整除y和b,即f(y,b)=f(x,y)。即f(x,y)=f(y,x%y)。

优点:高效

缺点:取模运算,开销大

 

 

辗转相减法:

原理:设f(x,y)表示x,y的最大公约数k,则可设x=mk,y=nk,则有x-y=(m-n)k,因为m和n都是正整数,则有x-y也可以被k整除,即f(x,y)=f(y,x-y)。

优点:开销小

缺点:迭代算法多,比如(1000000,1)的情况下。

 

 

取2求素法:

原理:1、f(x,y)=k*f(x1,y1);2、如果x=p*x1,假设p是素数,并且y%p!=0,那么f(x,y)=f(p*x1,y)=f(x1,y)。

由此可得到算法为:不断的对x和y做除2操作,直至两者均不能被2整除,采用辗转相减法,获得一个可被2整除的数,继续做除2操作,循环,直至两数之一为0。详细描述如下:

若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(x,y/2) = f(x,y>>1)

若x,y均为奇数,f(x,y) =f(y,x-y)

 

 

 

原创粉丝点击