辗转相除法求最大公约数

        我们经常碰到求最大公约数的问题,很多人也都听过辗转相除法求最大公约数,那么什么是辗转相除法,他的原理又是什么呢?

        首先,什么是辗转相除法?

        欧几里得算法_百度百科

        这个链接会告诉你什么是辗转相除法,如果你懒得过去看,那么看一下我的证明。(基于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上想,否则不是人人欧几里得了?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值