• [转载]辗转相除法


     来源:Internet

    关于辗转相除法, 搜了一下, 在我国古代的《九章算术》中就有记载,现摘录如下:

    约分术曰:可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。

    其中所说的等数,就是最大公约数。求等数的办法是更相减损法,实际上就是辗转相除法。

    辗转相除法求最大公约数,是一种比较好的方法,比较快。

    对于5231775569两个数,你能迅速地求出它们的最大公约数吗?一般来说你会找一找公共的使因子,这题可麻烦了,不好找,质因子大。

    现在教你用辗转相除法来求最大公约数。

    先用较大的75569除以52317,得商1,余数23252,再以52317除以23252,得商2,余数是5813,再用23252做被除数,5813做除数,正好除尽得商数4。这样5813就是556952317的最大公约数。你要是用分解使因数的办法,肯定找不到。

    那么,这辗转相除法为什么能得到最大公约数呢?下面我就给大伙谈谈。

    比如说有要求ab两个整数的最大公约数,ab,那么我们先用a除以b,得到商 q1,余数r1a÷bq1…r1我们当然也可以把上面这个式子改写成乘法式:ab * q1r1------l

    如果r10,那么b就是ab的最大公约数3。要是r1≠0,就继续除,用b除以r1,我们也可以有和上面一样的式子:

    br1q2r2-------2

    如果余数r20,那么r1就是所求的最大公约数3。为什么呢?因为如果2)式变成了br1q2,那么b1r1的公约数就一定是a1b的公约数。这是因为一个数能同时除尽br1,那么由l)式,就一定能整除a,从而也是a1b的公约数。

    反过来,如果一个数d,能同时整除a1b,那么由1)式,也一定能整除r1,从而也有db1r1的公约数。

    这样,ab的公约数与br1的公约数完全一样,那么这两对的最大公约数也一定相同。那b1r1的最大公约数,在r10时,不就是r1吗?所以ab的最大公约数也是r1了。

    有人会说,那r2不等于0怎么办?那当然是继续往下做,用r1除以r2……直到余数为零为止。

    在这种方法里,先做除数的,后一步就成了被除数,这就是辗转相除法名字的来历吧。

    一般用辗转相除法,都列成下面的式子:

                  

    不过,《九章》中的辗转相除法略有些不同,它叫更相减损,是辗转相减的方法。这也很好理解,除法就是一种连续地减去除数的一种简便运算,一直减到结果比除数小为止。

    比如我们用更相减损法来求9149的最大公约数,可以由9149一次,得余42;再由4942一次,余7;更由427,这一回要减五次,余的还是7,再减,就是0了。那么这个7就是9149的最大公约数。这个7就是约分术中所谓的等数,因为减得结果和最后一次的减数相等了,就叫等数。

    辗转相除法在小学中学都没教过,恐怕是有点难讲清其中的道理。不过,两千多年前的古人居然有此创造,咱们后人再学不会,可就惭愧了,何况这还是一种很实用的方法。

    上面这些讲解均来自网络,由于忘记来源,不能标明出处,还望谅解!


    ######################################改进########################################

    #include <stdio.h>
    int main()
    {
        int m, n;
        int m_temp, n_temp, res;
        printf("Enter two integer:\n");
        scanf("%d %d", &m, &n);
        m_temp = m;
        n_temp = n;
        if (m > 0 && n >0)
        {
            do
            {
                res = n % m;
                n = m;
                m = res;
            } while (m != 0);

            printf("Greatest common divisor: %d\n", n);
            printf("Lease common multiple  : %d\n", m_temp * n_temp / n);
        }
        else printf("Error!\n");
        return 0;
    }


    测试结果:
    ===================================
    Enter two integer:
    22 33↙
    Greatest common divisor: 11
    Lease common multiple  : 66
    ===================================

  • 相关阅读:
    python 对xls写入信息
    Python 字符串前面加u,r,b,f的含义
    inner join 与 left join 之间的区别
    时间戳转换成日期展示的方法 且 搜索范围
    Python与C/C++相互调用(python2 调c++那个试了ok)
    爆库记录(X-Forwarded-For注入漏洞实战 记录)
    笔记
    墨者学习安全测试的网站(看起来很不错的样子 有空看看)
    sqlmap开源 测试sql注入的工具 各种参考链接
    菜鸟浅谈——web安全测试(这篇不错有空看看)
  • 原文地址:https://www.cnblogs.com/erwin/p/704399.html
Copyright © 2020-2023  润新知