基礎算法—-輾轉相除求最大公約數

題目背景

約數

如果數 a 能被數 b 整除,a 就叫做 b 的倍數,b 就叫做 a 的約數

最大公約數

最大公約數就是兩個數中,大家都能相約且最大的數。

輾轉相除法

輾轉相除法又名歐幾里得算法(Euclidean algorithm),目的是求出兩個正整數的最大公約數。它是已知最古老的算法,其可追溯至公元前300年前。

這條算法基於一個定理:兩個正整數 a 和 b(a 大於 b),它們的最大公約數等於 a 除以 b 的餘數 c 和 較小數 b 之間的最大公約數。

算法計算過程是這樣的:

  • 2個數相除,得出餘數
  • 如果餘數不爲0,則拿較小的數與餘數繼續相除,判斷新的餘數是否爲0
  • 如果餘數爲0,則最大公約數就是本次相除中較小的數。

比如數字 25 和 10 ,使用輾轉相除法求最大公約數過程如下:

  • 25 除以 10 商 2 餘 5
  • 根據輾轉相除法可以得出,25 和 10 的最大公約數等於 5 和 10 之間的最大公約數
  • 10 除以 5 商 2 餘 0, 所以 5 和 10 之間的最大公約數爲 5,因此25 和 10 的最大公約數爲 5

題目要求

完善函數 gcd 的功能。函數 gcd 會計算並返回傳入的兩個正整數參數之間最大的公約數

如下所示:

gcd(30,3); // 返回結果爲 3
gcd(12, 24); // 返回結果爲 12
gcd(111, 11); // 返回結果爲 1

 

function gcd(num1,num2){
    var remainder = 0;
    do{
       remainder = num1 % num2;
       num1 = num2;
       num2 = remainder;
    }while(remainder!==0);
    return num1;
}

console.log(gcd(24,12));

 

實現輾轉相除法通常有兩種思路,分別如下

1、使用循環實現

function gcd(number1, number2){
  // 創建一個表示餘數的變量
  var remainder = 0;
  // 通過循環計算
  do {
    // 更新當前餘數
    remainder = number1 % number2;
    // 更新數字1
    number1 = number2; 
    // 更新數字1
    number2 = remainder;
  } while(remainder !== 0);
  return number1;
}

2、使用函數遞歸

function gcd(number1, number2) { 
  if (number2 == 0) {
    return number1; 
  } else {
    return gcd(number2, number1 % number2); 
  }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章