Smallest Common Multiple

What is "Smallest Common Multiple" ?     wiki entry about Least Common Multiple

  標題的Smallest Common Multiple其實就是最小公倍數(Least Common Multiple)- 兩個整數公有的倍數稱為它們的公倍數,其中最小的一個正整數稱為它們兩個的最小公倍數,而最小公倍數在一般我們實際算的時候,通常是先做質因數分解,然後再依數字質因數分解後的式子,找出最小公倍數,Ex: 有3個數x, y, z: x = 2 = 2^1, y = 3 =, z = 4 = 2^2  ⇒  lcm(x, y, z) = 2^(2) * 3

function smallestCommons(arr) {
  arr.sort();
  var numberset = [];
  for(var i=arr[0];i<=arr[1];i++)
  {
    numberset.push(i);
  }
  function gcd(x, y)
  {
    while(y !== 0)
    {
      var tmp = x % y;
      x = y;
      y =tmp;
    }
    return x;
  }
  function lcm(x, y)
  {
    return (x * y)/gcd(x,y);
  }
  var multiple = arr[0];
  numberset.forEach(function(emt)
            {
                multiple = lcm(multiple, emt);
            });
  return multiple;
}
smallestCommons([1, 13]);

Solution:

但如果我們在寫程式使用上述方法計算最小公倍數的話,會相當難實作,故我們只好利用一個性質: gcd(a, b) * lcm(a, b) = a * b ,即兩數相乘的乘積等於兩數的最大公因數*最小公倍數,為什麼會選用這個方式呢? 因為題目要求是對一大堆數字做最小公倍數,所以如果要對每個數做質因數分解,對此類題目是相當不好處理,所以選用了這個方式,由於是要對一大堆數字求最小公倍數,因為無法一次求出所有數的最小公倍數,因為只要數字一多,最大公因數就會變為 1,如此一來就無法找出其中幾個數之間共有的,且值不為1的最大公因數,並且因此無法藉由此方法一次求得所有數的最小公倍數,所以這裡的則是要針對每個數做最小公倍數,並且將結果一直累積(記得將前次計算結果放入下一次計算中,類似數字加總 sum += element;),這樣一來才能正確地求得最小公倍數



P.S. / Reference:  Smallest Common Multiple
          Greast Common Divisor
          How to find the least common multiple of a range of numbers? - stackoverflow

results matching ""

    No results matching ""