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

JavaScript for循环输出异常排查:约数相同数对统计问题

解决countPairsInt函数的TypeError问题

错误根源

抛出TypeError: Cannot read properties of undefined (reading '1')的核心原因是最后一个for循环的边界条件错误:当i + diff超过numsAndDivs数组的最大索引时,numsAndDivs[i+diff]会变成undefined,此时访问它的[1]属性必然触发报错。

原循环条件i < numsAndDivs.length -1仅限制了i的上限,但未考虑i+diff不能超出数组范围。比如调用countPairsInt(3,100)时,数组长度为100,当i取到97时,i+diff=100,而数组最大索引是99,numsAndDivs[100]即为undefined。

修复方案

调整循环边界条件,确保i+diff始终在数组索引范围内,同时修正循环起始索引(原代码从i=1开始会漏掉第一个元素的数对检查):

function countPairsInt(diff, nMax) {
  const numbers = [];
  for (let i=1; i<=nMax; i++) {
    numbers.push(i);
  }
 
// 优化约数计数逻辑,无需存储数组,直接返回数量,提升效率
  function divisors(num) {
    let count = 0;
    for (let i=1; i*i <= num; i++) {
      if (num % i === 0) {
        // 若i和num/i是同一个数,仅计数1次;否则计数2次
        count += i === num/i ? 1 : 2;
      }
    }
    return count;
  }
  
  const numsAndDivs = numbers.map(x=> [x, divisors(x)]);
  let equalDivs = 0;
  // 循环条件改为i < numsAndDivs.length - diff,确保i+diff不越界
  for (let i=0; i < numsAndDivs.length - diff; i++) { 
    if (numsAndDivs[i][1] === numsAndDivs[i+diff][1] ){
      equalDivs++;
    }
  }
  return equalDivs
}

countPairsInt(1, 50); // 返回8
countPairsInt(3, 100) // 返回7

额外优化

原divisors函数通过存储所有约数再取长度的方式效率较低,尤其当num值较大时。优化后的函数通过遍历到sqrt(num)直接计数,省去了数组存储操作,大幅提升性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:05:46