1. 程式人生 > >Smallest Common Multiple FreeCodeCamp

Smallest Common Multiple FreeCodeCamp

給定 基本 ons 避免 fun alt multi num 分析

題目:找出能被兩個給定參數和它們之間的連續數字整除的最小公倍數。 範圍是兩個數字構成的數組,兩個數字不一定按數字順序排序。

分析:首先題目的意思求一個連續數列的所有數字的最小公倍數,這連續的數字序列可能遞增,也可能遞減,有兩種情況,為了使代碼簡潔,

   我們將其變為一種情況,也就是遞增數列,這樣避免重復寫遞減數列的情況。再一看,這裏說了參數是數組,那麽可以使用sort()方法排序。

   這道題其實只要懂得怎麽求兩個數之間的最小公倍數,就可以求這個序列的最小公倍數了。因為,最小公倍數也是一個數字,

而且無論多長的數列最終都可以化成是求兩個數字之間的最小公倍數。比如說你要求的數列1,2,3的最小公倍數是6,1和2的最小公倍數是2,

求最小公倍數 2 和3的最小公倍數也是6.以此類推即可。

   那麽最小公倍數怎麽求呢,查看百度百科 最小公倍數 的計算方法

   https://baike.baidu.com/item/%E6%9C%80%E5%B0%8F%E5%85%AC%E5%80%8D%E6%95%B0/6192375?fr=aladdin

 技術分享圖片

如圖,可知,最小公倍數等於它們的 最大公約數 和 它們各自與最大公約數的 商 的乘積。

那麽最大公約數這麽求呢,查看百度百科最大公約數的求法,

https://baike.baidu.com/item/%E6%9C%80%E5%A4%A7%E5%85%AC%E7%BA%A6%E6%95%B0/869308?fr=aladdin

可知,我們可以使用輾轉相除法也就是歐幾裏德算法

js使用遞歸實現為:

function gcd(m,n){
  if(m%n===0)return n;
  return gcd(n,m%n);
}

至此,思路已經基本清晰。完整實現代碼為:

function gcd(m, n){
if(m%n === 0) return n;
return gcd(n, m%n);
}

function smallestCommons(arr) {
arr = arr.sort();
var num = arr[0];
for(var i= arr[0]+1; i<=arr[1]; i++){
num *= i/gcd(num, i);
}
return num;
}

Smallest Common Multiple FreeCodeCamp