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
相关产品推荐
相关产品推荐

