辗转相除法:取两个数中最大的数做被除数,较小的数做除数,用最大的数除较小数,如果余数为0,则较小数为这两个数的最大公约数,如果余数不为0,用较小数除上一步计算出的余数,直到余数为0,则这两个数的最大公约数为上一步的被除数。
实现的方法有很多,可以用递归,也可以用循环,下面给出这两种简单的方法。
递归实现:
long long GCD(long long m,long long n)
{
if (m < n)
{
long long tmp = m;
m = n;
n = tmp;
}
if (n == 0)
return m; //余数为零时,结果为上一步的被除数
else
return GCD(n,m % n); //余数不为零,则一直递归
}
循环实现:
long long GCD(long long m,long long n)
{
if (m < n)
{
long long tmp = m;
m = n;
n = tmp;
}
while(m%n!=0){
long long tmp = m%n;
m=n;
n=tmp;
}
return n;
}