1,首先是最基本的思想:
直接遍历即可
int gcd_3(int a,int b)
{
int i,r;
int n;
r=a>=b?a:b;
for(i=1;i<r;i++)
if(a%i==0&&b%i==0)
n=i;
return n;
}
2,相减法:
int gcd_1(int a,int b)
{
while(a!=b)
{
if(a>b)
a-=b;
if(a<b)
b-=a;
}
return a;
}
递归实现:
int gcd_4(int a,int b)
{
if(a==b)
return a;
if(a>b)
return gcd_4(a-b,b);
else
return gcd_4(a,b-a);
}
3,辗转相除法:
int gcd_5(int a,int b)
{
int res;
res=a%b;
while(res)
{
a=b;
b=res;
res=a%b;
}
return b;
}
4,移位加减法:
int gcd_6(int a,int b)
{
if(a<b)
{
int temp = a;
a = b;
b=temp;
}
if(0==b)
return a;
if(a%2==0 && b%2 ==0)
return 2*gcd_6(a/2,b/2);
if ( a%2 == 0)
return gcd_6(a/2,b);
if ( b%2==0 )
return gcd_6(a,b/2);
else
return gcd_6((a+b)/2,(a-b)/2);
}
5,辗转相除法的简单(晦涩)实现:
int gcd_2(int a,int b)
{
while(a%=b^=a^=b^=a);
return b;
}
解析与评价:
方法5,展开为:
while(b^=a,a^=b,b^=a,a%=b,a);
前面的三重异或的目的是为了交换a,b的值
然后求余,最后是对a的判断。
。。。。。。。。。