- 辗转相除法, 又名欧几里德算法
int gcd(int a,int b)
{
if(b==0) return a;
return gcd(b,a%b);
}
- 数学归纳法
int gcd(int a,int b)
{
while(a!=b)
{
if (a>b) a-=b;
else b-=a;
}
return a;
}
- Stein算法
int gcd(int x,int y){
int i,j;
if (x==0) return y;
if (y==0) return x;
for (i=0;x&1==0;i++) x>>=1;
for (j=0;y&1==0;j++) y>>=1;
if (i>j) i=j;
while (1){
if (x<y) {
x^=y;
y^=x;
x^=y;
}
if ((x-=y)==0) return y<<i;//此处x的值已经发生改变,不等价于x==y
while (x&1==0) x>>1;
}
}