JavaScript中!运算符使用问题:Codewars欧拉习题1解题报错求助
代码问题分析与修复
原代码的核心问题
遍历与倍数判断逻辑错误
用number-i找倍数完全没必要,直接遍历i从1到number-1,判断i是否为3或5的倍数即可。原代码里累加number/3更是完全错误,应该累加符合条件的i本身。NOT运算符使用错误
表达式(!(number-j)%3)===0的优先级逻辑混乱——!优先级高于%,会先把number-j转成布尔值取反,再对3取模,完全不符合“不是3的倍数”的判断需求。正确写法应为(number-j)%3 !== 0,或直接写i%5===0 && i%3!==0。重复遍历与冗余计算
两次循环分别处理3和5的倍数,既低效又易出错。其实可以在单个循环里处理所有情况:只要i是3或5的倍数,就加到结果中(同时是两者倍数的数只会被加一次,因为逻辑或||只要满足一个条件就会执行,不会重复计算)。
修复后的基础版本代码
function solution(number) { let result = 0; if (number < 0) return 0; for (let i = 1; i < number; i++) { if (i % 3 === 0 || i % 5 === 0) { result += i; } } return result; }
高效数学解法(适用于大数场景)
如果传入的number数值很大,循环遍历会很慢,可通过数学公式直接计算:
- 计算小于number的3的倍数之和:
3 * n*(n+1)/2,其中n = Math.floor((number-1)/3) - 计算小于number的5的倍数之和:
5 * m*(m+1)/2,其中m = Math.floor((number-1)/5) - 减去重复计算的15的倍数之和(同时是3和5的倍数被重复加了两次):
15 * k*(k+1)/2,其中k = Math.floor((number-1)/15)
代码实现:
function solution(number) { if (number < 0) return 0; const sumMultiples = (x) => { const count = Math.floor((number - 1) / x); return x * count * (count + 1) / 2; }; return sumMultiples(3) + sumMultiples(5) - sumMultiples(15); }
内容的提问来源于stack exchange,提问作者Kabocz
相关产品推荐
相关产品推荐

