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

weixin_30363509發表於2018-01-13

題目背景

約數

如果數 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); 
  }
}

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

轉載於:https://www.cnblogs.com/chivasknight/p/8278968.html

相關文章