寻找两个值的公共因数

5
我有以下javascript代码来计算数字的因素。

var some = [];
var main = "";
var final = "";

function text(data) {
  spliter = data.split(",");

  var k = 0;
  while (k < spliter.length) {
    var meethi = 0;;
    main = spliter[k];

    var datas = "";
    for (var i = 1; i <= 10; i += 1) {
      meethi = Math.abs(main / i);
      datas = meethi;
      some.push('' + datas + '');
    }
    some.forEach(myFunction);
    final += res + '<br>';
    k++;
  }

  return final;
}
var max = 0;
var res = "";

function myFunction(item) {
  var van = item.split(".");
  if (van[1] == undefined) {
    var high = Math.floor(main / van[0]);
    if (high > max) {
      max = high;
      res += max + ':';
    }
  }
}
document.getElementById('demo').innerHTML = text('124,20');
<p id="demo"></p>

我的程序获取具有两个值的因数。如何确定这两个值的共同因数,仅得到最高公共值?
例如:('124,20') 输出 --> 4
我尝试了自己的代码。如果您对代码有任何其他建议,请告诉我并更正我的代码以获得所需的结果。
我的示例代码链接:my fiddle

1
看起来你已经可以找出这些因数了,所以共同的因数就是两个列表中都出现的。那么你的问题是什么?另外,在你的例子中有三个共同的因数(1、2和4),那么为什么你只想要4作为结果呢? - Jamiec
@jamiec 是的,正确的。需要找到两者的最大公因子,即最高的公共值。 - user6752436
啊,没错,这被称为最大公约数,正如你从给出的答案中所看到的那样,这是一个众所周知的问题。 - Jamiec
1个回答

9
您可以使用欧几里得算法来求最大公约数。

function gcd(k, n) {
    return k ? gcd(n % k, k) : n;
}

console.log(gcd(124, 20));
console.log([10, 500, 600].reduce(gcd));


3
你难道不喜欢当问题的答案在公元前300年就被阐述了吗! - Jamiec
1
“所有算法的祖师爷,因为它是最古老的非平凡算法之一,至今仍然存在。” [唐纳德·克努斯] - Nina Scholz
谢谢。如果有超过两个值,例如 ('10,500,600'),我该怎么办? - user6752436
你可以使用 Array#reducegcd 作为回调函数,因为你可以将 gcd 链接到每个部分的前一个计算结果上。 - Nina Scholz
% 是取模或余数运算符。它计算除法的余数,例如 9 / 4 的结果是商为 2,余数为 1。 - Nina Scholz
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接