zoukankan      html  css  js  c++  java
  • 求最大公约数

    辗转相除法

      设两数为a、b(a>b),求a和b最大公约数(a,b)的步骤如下:用a除以b,得a÷b=q......r1(0≤r1)。若r1=0,则(a,b)=b;若r1≠0,则再用b除以r1,得b÷r1=q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r1除以r2,……如此下去,直到能整除为止。其最后一个为被除数的余数的除数即为(a, b)。
      例如:a=25,b=15,a/b=1......10,b/10=1......5,10/5=2.......0,最后一个为被除数余数的除数就是5,5就是所求最大公约数。
     

    数学证明

      设两数为a、b(b<a),用gcd(a,b)表示a,b的最大公约数,r=a (mod b) 为a除以b以后的余数,k为a除以b的商,即a÷b=k.......r。辗转相除法即是要证明gcd(a,b)=gcd(b,r)。
      第一步:令c=gcd(a,b),则设a=mc,b=nc
      第二步:根据前提可知r =a-kb=mc-knc=(m-kn)c
      第三步:根据第二步结果可知c也是r的因数
      第四步:可以断定m-kn与n互质【否则,可设m-kn=xd,n=yd (d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)dc,b=nc=ycd,故a与b最大公约数成为cd,而非c,与前面结论矛盾】
    从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。
      证毕。
     
    代码实现
    unsigned gcd(unsigned x, unsigned y)
    {
        if (x < y){                    //不加此调整代码也可以,不过加上思路更清晰
            return gcd(y, x);
        }
    
        return (!y) ? x : gcd(y, x % y);
    }

    参考资料:辗转相除法 (百度百科)

                  最大公约数

  • 相关阅读:
    第六阶段·数据库MySQL及NoSQL实践第1章·章节一MySQL数据库
    小象和老鼠
    好句子啊
    LGTB 与 序列
    最小环
    精灵魔法
    C#委托之我见
    MySQL——优化ORDER BY语句
    MySQL——索引实现原理
    是什么影响了数据库索引选型?
  • 原文地址:https://www.cnblogs.com/amanlikethis/p/4853762.html
Copyright © 2011-2022 走看看