展轉相除法求最大公約數——[js練習]

題目背景

約數

若是數 a 能被數 b 整除,a 就叫作 b 的倍數,b 就叫作 a 的約數javascript

最大公約數

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

展轉相除法

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

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

算法計算過程是這樣的:函數

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

好比數字 25 和 10 ,使用展轉相除法求最大公約數過程以下:idea

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

題目要求

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

以下所示:code



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));

實現展轉相除法一般有兩種思路,分別以下blog

一、使用循環實現

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

 

二、使用函數遞歸

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

更多關於遞歸:https://msdn.microsoft.com/zh-cn/library/wwbyhkx4.aspx遞歸

相關文章
相關標籤/搜索