1、辗转相除法
也叫欧几里德算法。
//迭代法
int GCD1(int a,int b) //GreatestCommonDivisor
{
/*if(b==0)
{
return a;
}
else
{
int tem=a%b;
return GCD(b,tmp);
}*/
return b==0?a:GCD(b,a%b);
}
//循环法
int Swap(int &a,int &b){
int tmp=a;
a=b;
b=tmp;
}
int GCD2(int a,int b)
{
if(a<b){
Swap(a,b);
}
int tmp;
while(b!=0){
tmp=a%b;
a=b;
b=tmp;
}
return a;
}
2、更相减损法
/*
第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
*/
int GCD3(int a,int b){
if(a<b){
Swap(a,b);
}
return (a-b==0)?a:GCD3(b,a-b);
}
3、改进
bool IsEve(int t){
return (t&1)==0;
}
//即添加更相减损法的第一步
int GCD4(int a,int b){
int gcd=1;
if(IsEve(a)&&IsEve(b)){
if(a>0&&b>0){
gcd*=2*GCD4(a>>1,b>>1);
}else{
return 1;
}
}
else if(IsEve(a)){
if(a>0){
gcd*=GCD4(a>>1,b);
}else{
return 1;
}
}
else if(IsEve(b)){
if(b>0){
gcd*=GCD4(a,b>>1);
}else{
return 1;
}
}
else{
gcd*=GCD3(a,b);
}
return gcd;
}