对于最大公因数(gcd),书中给出两种算法,欧几里得算法和不断递归调用的求解方法:
欧几里得算法,其实现原理就是辗转相除法,证明略,实现如下:
//m>=n
int gcd(int m,int n)
{
while(n!=0){
int rem = m % n;
m = n;
n = rem;
}
return m;
}
另一个的不断递归,就是发现基本情况,然后对于大的数,不断地找出小的因子,让两个数不断变小至基本情况:
//保证n>m
bool isEven(int a)
{
return a % 2 == 0;
}
bool isOdd(int a)
{
return a % 2 != 0;
}
int gcd(int n, int m)
{
if (n == 1 || m == 1)
return 1;
if (n == m)
return n;
if (n < m)
swap(n, m);
//按条件递归
if (isEven(n) && isEven(m))
return 2 * gcd(n / 2, m / 2);
else if (isEven(n) && isOdd(m))
return gcd(n / 2, m);
else if (isOdd(n) && isEven(m))
return gcd(n, m / 2);
else if(isOdd(n) && isOdd(m))
return gcd((n + m) / 2, (n - m) / 2);
}