繁体   English   中英

查找两个数字之间的最高公因数

[英]Find highest common factor between two numbers

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

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),尽管返回2,但返回1

我将不胜感激任何帮助

谢谢

没有数字的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.length”,您需要使用“ num1_divisor.length”。 同样,您需要使用“ num2_divisor.length”代替“ num2.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
}

您可以在此处运行代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM