GCD大于2个数字

GCD of more than 2 numbers

本文关键字:数字 2个 大于 GCD      更新时间:2023-09-26
function gcd (a, b) {
    if(b == 0){
        return a;
    }
    return gcd(b, a%b);
}
function gcd_more_than_two_numbers (a) {
    var last = Math.max.apply(null, a);
    var first = Math.min.apply(null, a);    
    return gcd(first, last);
}
console.log(gcd_more_than_two_numbers([9999,213123,9,15,27])); 
console.log(gcd_more_than_two_numbers([5,10,15,25]));

在数组中取最低值和最高值,并为它们之间的所有数字找到gcd,这是正确的吗?这在数学上正确吗?

在数组中取最低值和最高值,并为它们之间的所有数字找到gcd,这是正确的吗?这在数学上正确吗?

没有


您需要获取第一对的gcd,然后针对数组的所有其他元素重新计算,您可以轻松地使用reduce:

function gcd (a, b) {
    if(b == 0){
        return a;
    }
    return gcd(b, a%b);
}
function gcd_more_than_two_numbers (a) {
  return a.reduce(gcd)
}
console.log(gcd_more_than_two_numbers([9999,213123,9,15,27]))

不,它不是。

你要找的身份是gcd(a, b, c) = gcd(gcd(a, b), c)

我建议你使用循环来取消递归。

    function gcd() {
      var arr = Array.prototype.slice.call(arguments);
      return arr.reduce(function(a, b) {
        if (b == 0) {
          return a;
        }
        return gcd(b, a % b);
      });
    }
    console.log(gcd(7,14));
    console.log(gcd(9999,213123,9,15,27)); 
    console.log(gcd(5,10,15,25));

您也可以使用array.every来检查有效性:

示例

function getGCD(arr) {
  var min = Math.min.apply(null, arr);
  var gcd = 1;
  for (var i = gcd + 1; i <= min; i++) {
    if (arr.every(x => x % i === 0))
      gcd = i;
  }
  return gcd;
}
var arr = [100, 13000, 1110];
var arr2 = [9999, 213123, 9, 15, 27]
console.log(getGCD(arr))
console.log(getGCD(arr2))