FreeCodeCamp筆記之:Smallest Common

作者: delphuy | 来源:发表于2017-10-23 12:02 被阅读15次

题目

找出能被两个给定参数和它们之间的连续数字整除的最小公倍数。
范围是两个数字构成的数组,两个数字不一定按数字顺序排序。
例如对 1 和 3 —— 找出能被 1 和 3 和它们之间所有数字整除的最小公倍数。
如果你被卡住了,记得开大招 Read-Search-Ask 。尝试与他人结伴编程、编写你自己的代码。
这是一些对你有帮助的资源:
Smallest Common Multiple

思路

  1. 为毛练习题都是在不停的算算术....我数学这么差
  2. 弄不明白公倍数到底是什么鬼,点开 Smallest Common Multiple 有点感觉了,但也没说到底要怎么算,难不成我也穷举一下?
image.png
  1. 自己拿笔画了画,感觉应该有公式能算出来
image.png
  1. 于是上百度大法,百度百科里果然给出了公式算法:
image.png
  1. 所以思路就是先取得数组的最小值和最大值;
  2. 取得最小值与 min.arr+1 的最小公倍数存入temp,然后取得temp与min.arr+i 的最小公倍数等等一直循环下去;
  3. 最后取得temp 与max.arr的最小公倍数即是整个数组的最小公倍数;
  4. 但是问题又出现了,要怎么取得两个数的最大公约数呢?
  5. 继续百度大法,得知居然有这个东西;gcd(共产党....?)、lcm;继续百度,得知有gcd 代表这个:欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数


    image.png
  6. 多读书还是有用的,先尝试解题;

解答

function smallestCommons(arr) {
  var temp = [];
  var min = Math.min.apply(this,arr);
  var max = Math.max.apply(this,arr);
  for(var i = min; i <= max; i++) {
    temp.push(i);
  }
  var gcd = function(a,b) {      //定义最大公约数取得方式;
    if(b>0){
      return gcd(b, a % b) ;      
    } 
      return a;
  };  
  return temp.reduce(function(preValue,curValue) { 
   return preValue*curValue/gcd(preValue,curValue);   //对temp数组进行迭代,取得最终的2个值的最小公倍数
  }); 
}
smallestCommons([1,5]);
  • 在摸索gcd的时候花了很长时间,一开始以为gcd 本身就是个函数,可以直接用,but不行,所以先定义了一下;
  • 在最后的时候,本来想用for来比对temp的所有的最大公倍数,但想到如果这个数值很大,会不会导致超时;查了很多资料,发现之前有学过的reduce()可以实现数组迭代;看来还是学的不牢,继续加油!

相关文章

网友评论

    本文标题:FreeCodeCamp筆記之:Smallest Common

    本文链接:https://www.haomeiwen.com/subject/bqwouxtx.html