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

JavaScript中!运算符使用问题:Codewars欧拉习题1解题报错求助

代码问题分析与修复

原代码的核心问题

  1. 遍历与倍数判断逻辑错误
    用number-i找倍数完全没必要,直接遍历i从1到number-1,判断i是否为3或5的倍数即可。原代码里累加number/3更是完全错误,应该累加符合条件的i本身。

  2. NOT运算符使用错误
    表达式(!(number-j)%3)===0的优先级逻辑混乱——!优先级高于%,会先把number-j转成布尔值取反,再对3取模,完全不符合“不是3的倍数”的判断需求。正确写法应为(number-j)%3 !== 0,或直接写i%5===0 && i%3!==0。

  3. 重复遍历与冗余计算
    两次循环分别处理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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:01:27