我们经常碰到求最大公约数的问题,很多人也都听过辗转相除法求最大公约数,那么什么是辗转相除法,他的原理又是什么呢?
首先,什么是辗转相除法?
这个链接会告诉你什么是辗转相除法,如果你懒得过去看,那么看一下我的证明。(基于C)
对于给定的两个数 x , y (x < y),我们可以把他们表示为这样的形式,y = kx + b (0 <= b <= x)以及 x = mz , y = nz ,其中m与n互质,那么z就是x,y的最大公约数。
y % x 在这里就是b,把下面那两个倍数代到第一个关系式里面就可以把b表示出来b = (n - km)z。
那么其实我们只要证明x , y的最大公约数z 与 b ,x的最大公约数相等即可。那么问题就会转换成证明 (n - km)与 m 互质。
用反证法证明,假设他们不互质,把他们的最大公约数记成 t ,(n - km)= pt , m = qt,那么n = pt + km = pt + k(qt) = (p + kq)t。所以y = (p + kq)tz,x = qtz,那么 x 与 y的最大公约数就变成了 tz 。那么我们很快就发现tz = z,那么t等于1 ,也就说明其实 (n - km)与 m 是互质的。那假设就不成立了,所以辗转相除法就成立了。
#include <stdio.h>
int main()
{
int a, b, c;
scanf("%d%d", &a, &b);
while (b)
{
c = a % b;
a = b;
b = c;
}
printf("%d", a);
return 0;
}
我认为写出这个题的关键不在于懂它的内在逻辑,而是更希望我们知道辗转相除法这个方法,因为我觉得如果真碰上了这题,我们几乎不会想到往y % x上想,否则不是人人欧几里得了?