1.辗转相除法
数学公式:假设x=k*y+b,f(x,y)表示最大公约数。那么f(x,y)=f(y,x%y)。
解释:如果某个数能整除x,y,那么一定能整除b,b=x%y。
1.1代码
int gcd(int a,int b)
{
return (!b)? a:gcd(b,a%b);
}
2.利用减法代替除法(x>y)
解释:f(x,y)=f(x-y,y)
2.1代码
int gcd2(int a,int b)
{
if(a<b)
return gcd2(b,a);
if(b==0)
return a;
else
return gcd2(a-b,b);
}
3.减法和位移结合(x>y)
公式:1.y=ky',x=kx',则f(y,x)=k*f(y',x')。2.如果p是素数,且x能被p 整除,y不能被整除,f(x,y)=f(x/p,y)。
取p=2;
2.2代码