求两个数之间的最大公因数

Find highest common factor between two numbers

本文关键字:之间 公因数 两个      更新时间:2023-09-26

我正在尝试确定两个数字之间的最大公因数。这是我的代码

function Division(num1,num2) { 
  var sum = 1
  //contain all divisor which can divide num without remainder
  var num1_divisor = []
  var num2_divisor = []
  //if num1%divisor == 0 , store in num1 divisor
  for (var i = 1 ; i < num1 ; i++)
  {
     if ( num1 % i == 0 )
     {
        num1_divisor.push(i)
     }
  }
  console.log(num1_divisor)
  //if num2%divisor == 0 , store in num1 divisor
   for (var i = 1 ; i < num1 ; i++)
  {
     if ( num2 % i == 0 )
     {
        num2_divisor.push(i)
     }
  }
  console.log(num2_divisor)
  //if num1_divisor is contained in num2 divisor
  //mulitply them by sum
  for ( var i = 0 ; i < num1.length ; i++)
  {
        var num1_value = num1_divisor[i]
       for ( var j = 0 ; j < num2.length ; j++)
       {
         var num2_value = num2_divisor[j]
          if (num1_value == num2_value )
          {
            sum = sum * num2_value
          }
       }
  }
         return sum
}

程序的逻辑如下:对于num1和num2,它将把所有可除的值分别存储在num1_divisor和num2_divisor中。然后,我将把num1_divisor和num2_divisor之间的所有公约数相乘,以找到这两个数字之间的最大公约数。

我检查了程序,比较部分似乎有错误

 if (num1_value == num2_value )
              {
                sum = sum * num2_value
              }

由于我不知道的原因,num1_value不等于num2_value,尽管这两个数字是相同的。

一个例子是Division(10,12),它返回1,虽然它应该返回2

我很感激你的帮助

谢谢

一个数字没有length,您可能想要检查num1_divisor.length而不是num1.lengthnum2_divisor.length而不是num2.length

同时,您需要确保用于查找除数的循环包含数字本身,因为数字是其自身的除数。

for (var i = 1 ; i <= num1 ; i++)

for (var i = 1 ; i <= num2 ; i++)

经过这些修改,结果似乎是正确的

下面是查找最大公因数的更简单版本,它应该

// Generate an array from 0 to limit
function range(limit){
  return Array.apply(null, Array(limit)).map(function (_, i) {return i;});
}
function greatestCommonFactor(number1, number2){
  // Figure out who's larger and smaller
  var largerNumber = Math.max(number1, number2);
  var smallerNumber = Math.min(number1, number2);
  // Use a range to avoid using counters and increments
  var numbersUpToLargest = range(largerNumber + 1).slice(1);
  // Find the numbers that divide the larger number perfectly
  var largeNumberFactors = numbersUpToLargest.filter(function(number){
    return !(largerNumber % number);
  });
  // With the larger number's factors, find the ones that divide the smaller number perfectly
  var commonFactors = largeNumberFactors.filter(function(factor){
    return !(smallerNumber % factor);
  });
  // Since we ordered from lowest to highest, reverse the array and get the first.
  return commonFactors.reverse()[0];
}
alert(greatestCommonFactor(10, 12));

我在你的代码中发现了这个问题,问题不是你怀疑的地方,而是在两个for循环中,你在哪里找到除数数组的长度。而不是使用"num1"。长度",你需要使用"num1_divisor.length"。类似地,代替"num2"。长度",你需要输入"num2_divisor.length"

更正版本如下:

function Division(num1,num2) { 
  var sum = 1
  //contain all divisor which can divide num without remainder
  var num1_divisor = []
  var num2_divisor = []
  //if num1%divisor == 0 , store in num1 divisor
  for (var i = 1 ; i < num1 ; i++)
  {
     if ( num1 % i == 0 )
     {
        num1_divisor.push(i)
     }
  }
 //alert(num1_divisor)
  //if num2%divisor == 0 , store in num1 divisor
   for (var i = 1 ; i < num1 ; i++)
  {
     if ( num2 % i == 0 )
     {
        num2_divisor.push(i)
     }
  }
 //alert(num2_divisor)
  //if num1_divisor is contained in num2 divisor
  //mulitply them by sum
  //alert(num2_divisor.length);
  for ( var i = 0 ; i < num1_divisor.length ; i++)
  {
     // alert(i);
        var num1_value = num1_divisor[i]
       for ( var j = 0 ; j < num2_divisor.length ; j++)
       {
         var num2_value = num2_divisor[j]
//alert( num1_value);
//alert( num2_value);           
          if (num1_value == num2_value )
          {
              //alert(sum);
            sum = sum * num2_value
          }
       }
  }
         return sum
}

你可以在这里运行你的代码