使用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); }
这里有两个致命问题:
- 无限循环:
for (; i > 0;);末尾的分号直接终止了循环体,后面的if语句根本不在循环内。而且初始i = n,没有在循环里正确递减的逻辑,导致i永远大于0,浏览器会一直执行这个循环直到崩溃。 - 约数判断逻辑错误:
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
相关产品推荐
相关产品推荐

