Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript最不常见的多个函数因数量过大而失败_Javascript_Algorithm - Fatal编程技术网

Javascript最不常见的多个函数因数量过大而失败

Javascript最不常见的多个函数因数量过大而失败,javascript,algorithm,Javascript,Algorithm,我有一个lcm函数,对于非常大的数字,而不是较小的数字,它失败了。例如,在输入(6,8)时,它返回24作为lcm。但是,如果我执行(20000000000199999999)之类的操作,我的while循环将无限循环,并且不返回任何内容 我正在使用一个大整数库来处理大数字,但它似乎不起作用。代码如下: function lcm(n1, n2) { n1 = bigInt(n1).value; //bigInt comes from the big-integer library n2 =

我有一个lcm函数,对于非常大的数字,而不是较小的数字,它失败了。例如,在输入(6,8)时,它返回24作为lcm。但是,如果我执行(20000000000199999999)之类的操作,我的while循环将无限循环,并且不返回任何内容

我正在使用一个大整数库来处理大数字,但它似乎不起作用。代码如下:

function lcm(n1, n2) {

  n1 = bigInt(n1).value; //bigInt comes from the big-integer library
  n2 = bigInt(n2).value;

  let smaller = bigInt.min(n1, n2);
  let bigger = bigInt.max(n1, n2);
  let s1 = smaller;

  if (smaller === 1) { 
    return bigger;
  } else if (bigger === 1) {
    return smaller;
  }

  while (s1 % bigger !== 0) { //once s1 % bigger is 0, we found the lcm in s1's variable

    s1 = bigInt(s1).add(smaller);
    console.log(s1);

  }
  return s1;
}
有什么想法吗?

如果您正在使用它,那么您很幸运-它为您提供了内置的
lcm
方法:

如果您想查看它的实现,请在存储库中查看源代码

在上述库中实现该方法:


希望这能帮助你:)

你的算法太慢了。随着
n1=2000000000
n2=199999999
它正在进行20亿次
add
调用。您可以使用以下公式:

lcm(a, b) = a * b / gcd(a, b)
要计算gcd(a,b)(最大公约数),您需要实现基于除法的版本。递归实现:

function gcd(a, b) {
    return b == 0 ? a : gcd(b, a % b);
}

其他实现(如果您想避免递归)可以在这里找到:

Uh,
Math.min
/
max
/
%
不处理大整数。您需要一直使用BigInt库。@Bergie,我将Math.min/max更改为BigInt,thx以获取信息。谢谢您提供的信息,但出于我的目的,我真的很想找出我的函数失败的原因。这是我的作业,我真的必须弄清楚如何处理大数字/整数。像这样的lcm方法只是简单的解决方法。所以这个递归函数需要更少的调用才能找到解决方案?@Dream\u Cap,很多。实际上,它打了两个电话。但它不需要是递归的,哦,哇。我需要找到一种更好的方法来可视化递归。我终于要上算法课了,这里有很多递归。但对我来说,这似乎是一种魔力。我理解基本情况,但不理解递归如何形成解决方案。@Dream_Cap,关键是基于除法的欧几里德算法。它可以是迭代的,也可以是递归的,这无关紧要。检查这个链接,试试数字2265531501023473145,你的函数会给出一个稍微不同的值。你如何处理这种情况?