找到除数数组中的最小公约数

时间:2014-09-08 09:15:02

标签: javascript arrays

我在javascript中有一个数学问题:

我有一系列除数:

var divisors = [“3”,“4”,“5”,“10”,“12”,“15”,“20”,“30”,“60”]

以及在其中一个项目中没有提醒的情况下应该划分的项目数量:

var items_to_divide = [“10”,“30”]

我正在寻找一个函数,它会在items_to_divide之间从除数列表(var除数)中给出最低公约数。

在这个例子中,结果应该是5,因为10/5 = 2和30/5 = 6所以5是最低的公共分频器,因为它们都没有提醒而除以5。

任何人都可以在这里提出一个好的逻辑吗?

3 个答案:

答案 0 :(得分:2)

我建议采取以下步骤:

  1. 对您的除数数组进行升序排序
  2. 在此阵列上循环
  3. 检查当前除数是否将所有项目除以
  4. 如果是,则这是最低的公共分隔符。
  5. 这个算法的实现可以是这个:

    function best_divisor() {
      var division;
    
      // Sort divisor array from lowest value to highest one
      divisors = divisors.sort(function(a,b) {return +a > +b;});
    
      // Test each value of this array
      for (var i=0; i<divisors.length; i++) {
        divide = true;
    
        // check if it divides all values from the items_to_divide
        for (var j=0; j<items_to_divide.length; j++) {
          division = items_to_divide[j] / divisors[i];
          if(division !== Math.round(division)) {
            divide = false;
            break;
          }
        }
    
        // If all divisions give integers, this divisor is the lowest one
        if(divide) return divisors[i];
      }
    
      // No divisor found
      return -1;
    }
    

答案 1 :(得分:1)

var answer = NaN;
for(var i = 0; i < divisors.length; ++i) {
    var ok = true;
    for(var j = 0; j < items_to_divide.length; ++j) {
        if(parseInt(items_to_divide) % parseInt(divisors[i]) != 0) {
            ok = false;
            break;
        }
    }
    answer = answer && Math.min(ans || parseInt(divisors[i]), parseInt(divisors[i]));
}

console.log(answer);

答案 2 :(得分:1)

这将确保它一旦找到最低值就不会继续搜索除数。

var divisors = [3, 4, 5, 10, 12, 15, 20, 30, 60];
var items_to_divide = [10, 30];
var divisor = false;
for (var i = 0; i < divisors.length; i++) {
    var divisorfound = true;
    for (var j = 0; j < items_to_divide.length; j++) {
        if (items_to_divide[j] % divisors[i] !== 0) {
            divisorfound = false;
            break;
        }
    }
    if (divisorfound === true) {
        divisor = divisors[i];
        break;
    }
}
console.log(divisor);