文章出自個人博客https://knightyun.github.io/2019/09/03/js-lcm,轉載請申明。
最小公倍數(Least Common Multiple)
最小公倍數是中學數學知識中的一個概念,具體定義可以 自行了解,這裏只大致解釋一下,通常幾個正整數會存在許多個倍數,每個倍數除以這幾個正整數後都沒有餘數,而這些倍數之中最小的一個則稱爲最小公倍數;
一般直接計算最小公倍數較爲困難,因此需要用到一個計算公式,即兩個數的乘積等於這兩個數的最大公約數與最小公倍數的乘積,所以知道兩個數的最大公約數或者求最小公倍數,就可以求得另外一個,接下來先來實現最大公約數的求法;
最大公約數(Greatest Common Divisor)
這也是與最小公倍數相似的另一個概念,幾個正整數之間一般存在多個約數,即這幾個正整數除以這個約數後都沒有餘數,這些約數中最大的一個稱爲最大公約數;下面來實現求最大公約數的函數;
最大質因數法
思路很簡單,即將兩個數分別遞減,獲取能同時被二者除盡的最大的一個數,即最大公約數:
function getGcd(a, b) {
for (let i = a; i > 0; i--) {
for (let j = b; j > 0; j--) {
if (a % i === 0 && b % j === 0 && i === j) {
return j;
}
}
}
}
輾轉相除法
思路是用兩個數中的最大項除以最小項,如果能除盡,那麼最小項便是這兩個數的最大公約數;不能除盡則用最大項除以最小項所得餘數,與最小項再進行同樣的遞歸操作,最後得到最大的約數,也就是所謂的輾轉相除;
function getGcd(a, b) {
let max = Math.max(a, b);
let min = Math.min(a, b);
if (max % min === 0) {
return min;
} else {
return getGcd(max % min, min);
}
}
求最小公倍數
有了求最大公約數的函數後,再來求最小公倍數就簡單了:
function getLcm(a, b) {
return a * b / getGcd(a, b);
}