You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用For循环实现真约数求和:当前代码导致Chrome崩溃

修复计算正整数真约数和的函数(解决Chrome崩溃问题)

嘿,我来帮你搞定这个问题!你的代码导致Chrome崩溃的核心原因是无限循环,咱们先拆解原代码的问题,再给出正确的实现。

原代码的问题分析

先看看你写的代码:

function sumofProperDivisors(n){ 
  var i = n; 
  var b = 0; 
  for (; i > 0;); 
  if (n % i >= 2) { 
    b = b + i; 
    i--; 
  } else i--; 
  return (b); 
}

这里有两个致命问题:

  1. 无限循环:for (; i > 0;); 末尾的分号直接终止了循环体,后面的if语句根本不在循环内。而且初始i = n,没有在循环里正确递减的逻辑,导致i永远大于0,浏览器会一直执行这个循环直到崩溃。
  2. 约数判断逻辑错误:n % i >=2完全不符合真约数的判断规则,真约数应该满足n % i === 0(能被整除),并且i < n(不包含自身)。

正确的实现方案

基础版本(直观易懂)

这个版本遍历从1到n-1的所有数,判断是否为真约数并累加:

function sumofProperDivisors(n) {
  let sum = 0;
  // 遍历1到n-1,因为真约数不包含n自身
  for (let i = 1; i < n; i++) {
    if (n % i === 0) { // 能被整除就是真约数
      sum += i;
    }
  }
  return sum;
}

验证示例:

  • sumofProperDivisors(6) → 1+2+3 = 6 ✅
  • sumofProperDivisors(12) → 1+2+3+4+6 = 16 ✅

优化版本(高效处理大数)

如果需要处理很大的n,上面的方法效率偏低。可以只遍历到Math.sqrt(n),找到一个约数后同时加上对应的另一个约数(注意避免重复加平方根的情况):

function sumofProperDivisors(n) {
  if (n === 1) return 0; // 1没有真约数
  let sum = 1; // 1是所有大于1的正整数的真约数
  const sqrtN = Math.sqrt(n);
  for (let i = 2; i <= sqrtN; i++) {
    if (n % i === 0) {
      sum += i;
      const counterpart = n / i;
      // 如果两个约数不相等,才加另一个,避免比如4的平方根2重复加
      if (counterpart !== i && counterpart !== n) {
        sum += counterpart;
      }
    }
  }
  return sum;
}

这个版本的时间复杂度从O(n)降到了O(√n),处理大数时会快很多。

内容的提问来源于stack exchange,提问作者JG21

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:44:30