记的笔记
一、辗转相除法(欧几里得算法)
long long gcd(long long a,long long b)
{
return b==0?a:gcd(b,a%b);
}
缺点 两数太大时取模运算效率低
二、更相减损之术
默认参数为正
long long gcd(long long a,long long b)
{
if(a==b)
return a;
if(a>b)
return gcd(a-b,b);
else
return gcd(a,b-a);
}
缺点 两数相差较大时递归层数过多
移位优化
long long gcd(long long a,long long b)
{
if(a==b)
return a;
if(a<b)
return gcd(b,a);
else
{
if(!a&1&&!b&1)
return gcd(a>>1,b>>1)<<1;
else if(!a&1&&b&1)
return gcd(a>>1,b);
else if(a&1&&!b&1)
return gcd(a,b>>1);
else
return gcd(a-b,b);
}
}