求最大公约数的算法,这个我想应该是算法或程序书籍中的常客了,可是真正写时可能会忘掉,最简单的就是欧几里得算法(又称辗转相除法)。就是下面这种:
定理:gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b 不为0)
那么如果是多个数怎么整?
static int gmx_greatest_common_divisor(int p, int q)
{
int tmp;
while (q != 0)
{
tmp = q;
q = p % q; //求新的余数,就是那个a mod b
p = tmp; //更新p为原来的q
}
return p;
}
用辗转相除法求几个数的最大公约数,可以先求出其中任意两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数,依次求下去,直到最后一个数为止。最后所得的那个最大公约数,就是所有这些数的最大公约数。
从简单易于理解来说,用递归方式可能程序更加易于阅读,但是显然非递归函数比递归函数有更高的执行效率。
附递归方式:
int divisor(int m,int n)
{
if (m % n == 0)
{return n;}
else
{return divisor(n,m % n);}
}