使用 while 循环页面不断加载(codewars 问题)

using while loop the page keep loading over and over (codewars problem)

大家好,我正在尝试解决阶乘分解(codewars 任务) 好吧,一些数字与我一起工作,直到我到达第 23 页,页面不断循环,请有人帮助我

function decomp(n) {
  let c =[]
  let sum =1
 for(let i=n;i>=1;i--){
   sum*=i
 }
 let k= 2
 
 while(k<=sum){
  if(sum%k!==0){
  k++}
  while(sum%k==0){
    c.push(k)
sum = sum/k

} 
 }
  return c.join('*')
}

该函数在我到达数字 23 之前一直运行良好,不断加载,任务是关于函数 decomp(n) 并且应该 return 分解 n!以素数递增的顺序分解成它的素数因子,作为一个字符串。

阶乘可以是一个很大的数字(4000!有 12674 位数字,n 可以从 300 到 4000)。

在 Fortran 中 - 与在任何其他语言中一样 - returned 字符串不允许包含任何多余的尾随空格:您可以使用动态分配的字符串。

例子

n = 12;分解(12)->“2^10 * 3^5 * 5^2 * 7 * 11”

从 12 开始!被2整除十次,被3整除五次,被5整除两次,被7和11整除一次。

n = 22;分解(22)->“2^19 * 3^9 * 5^4 * 7^3 * 11^2 * 13 * 17 * 19”

n = 25;分解 (25) -> 2^22 * 3^10 * 5^6 * 7^3 * 11^2 * 13 * 17 * 19 * 23

23!无法用 double-precision floating-point format 准确表达,JavaScript 用于其数字。

但是,您不需要计算 n!。您只需要分解每个数字并连接它们的分解。

实际上,您甚至不需要对每个数字进行因式分解。请注意,给定 np,有 (n/p) 个数不大于 np 的倍数, (n/(p*p))p 的倍数p*p,等等

function *primes(n) {
  // Sieve of Eratosthenes 
  const isPrime = Array(n + 1).fill(true);
  isPrime[0] = isPrime[1] = false;
  for (let i = 2; i <= n; i++) {
    if (isPrime[i]) {
      yield i;
      for (let j = i * i; j <= n; j += i)
        isPrime[j] = false;
    }
  }
}

function decomp(n) {
  let s = n + '! =';
  for (const p of primes(n)) {
    let m = n, c = 0;
    // There are (n/p) numbers no greater than n that are multiples of p
    // There are (n/(p*p)) numbers no greater than n that are multiples of p*p
    // ...
    while (m = ((m / p) | 0)) {
      c += m;
    }
    s += (p == 2 ? ' ' : ' * ') + p + (c == 1 ? '' : '^' + c);
  }  
  return s;
}

console.log(decomp(12))
console.log(decomp(22))
console.log(decomp(23))
console.log(decomp(24))
console.log(decomp(25))