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

    面试被问到了,太菜了,不会写,特来学习记录下。

    辗转相除法

    辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。
    例如,求(319,377):
    ∵ 319÷377=0(余319)
    ∴(319,377)=(377,319);
    ∵ 377÷319=1(余58)
    ∴(377,319)=(319,58);
    ∵ 319÷58=5(余29)
    ∴ (319,58)=(58,29);
    ∵ 58÷29=2(余0)
    ∴ (58,29)= 29;
    ∴ (319,377)=29。

    代码如下:

    function fun(a, b) {
      if (a % b === 0) {
        return b
      }
      return fun(b, a % b)
    }
    console.log(fun(319, 377)) // 29
    

    更相减损法

    也叫更相减损术,是出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。
    第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
    第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
    则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
    其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法。所以更相减损法也叫等值算法。
    例1.用更相减损术求98与63的最大公约数。
    解:由于63不是偶数,把98和63以大数减小数,并辗转相减:
    98-63=35
    63-35=28
    35-28=7
    28-7=21
    21-7=14
    14-7=7
    所以,98和63的最大公约数等于7。
    这个过程可以简单的写为:
    (98,63)=(35,63)=(35,28)=(7,28)=(7,21)=(7,14)=(7,7)=7.
    例2.用更相减损术求260和104的最大公约数。
    解:由于260和104均为偶数,首先用2约简得到130和52,再用2约简得到65和26。
    此时65是奇数而26不是奇数,故把65和26辗转相减:
    65-26=39
    39-26=13
    26-13=13
    所以,260与104的最大公约数等于13乘以第一步中约掉的两个2,即1322=52。
    这个过程可以简单地写为:
    (260,104)(/2/2) =>(65,26)=(39,26)=(13,26)=(13,13)=13. (22) => 52

    代码如下,省去了判断双方都为偶数的部分,直接开始,类似上面的例1:

    function fun(a, b) {
      if (a === b) {
        return b
      }
      if (a > b) {
        a = a - b
      } else {
        b = b - a
      }
      return fun(a, b)
    }
    console.log(fun(319, 377)) // 29
    
  • 相关阅读:
    SQL 日常练习 (十八)
    SQL 日常练习 (十七)
    SQL 日常练习 (十六)
    SQL 日常练习(十五)
    SQL 日常练习 (十四)
    Join 实现 2 表数据联动
    SQL 强化练习 (十三)
    SQL 强化练习 (十二)
    SQL 强化练习 (十一)
    SAP B1:水晶报表中用Code128制作条型码的方法
  • 原文地址:https://www.cnblogs.com/cqkjxxxx/p/14975551.html
Copyright © 2011-2022 走看看