首页 > 解决方案 > 代码检查 3 和 5 的倍数

问题描述

我用javascript写了一个代码来解决这个问题:

“如果我们列出所有小于 10 且是 3 或 5 倍数的自然数,我们会得到 3、5、6 和 9。这些倍数之和是 23。

求 1000 以下所有 3 或 5 的倍数之和。”

但结果是错误的,我不知道为什么?你们能帮帮我吗

我的代码是:

function multipleSum(n){   
   var sum = 0;
   for(var i = 1; i<n; i++){
     var m3 = 3 * i;
     var m5 = 5 * i;    
     if(m3 < n  ){
       sum=sum+m3
     }
     if(m5 < n ){
       sum=sum+m5;
     }
     //if(m3 > n && m5 > n) {console.log(m3,m5,sum);break;}
   }
   return sum
}
console.log(multipleSum(1000)) //266333 but correct one is 233168 why?

标签: javascript

解决方案


你的逻辑有缺陷。您应该迭代每个数字(在范围内指定),并查看具有 3 或 5 的数字的模数是否为 0。如果模数为零,则表示该数是可整除的。

function multipleSum(n){
  var sum = 0;
  for(var i = 1; i<n; i++){
    if(i % 3 == 0 || i % 5 ==0){ // gives reminder of 0, divisible by either 3 or 5
      sum += i; // add in sum if that's the case.
    }
  }
  return sum
}
console.log(multipleSum(1000))

编辑:尝试了一些时间来理解为什么要采用乘法方法,我认为您正在收集因素并希望尽早从循环中突破,而不是迭代整个集合。这应该可以帮助您:

function multipleSum(n){
  var sum = 0;
  for(var i = 1; i<n; i++){
    var m3 = i * 3;
    var m5 = i * 5;
    if(m3 > n) break; // breaks early!!
    if(m3 < n) sum += m3
    if(m5 < n && m5 % 3 != 0) sum += m5; // make sure number is not divisible by 3, say m5 = 15, it will be captured as multiple of 3 anyway, we don't want duplicates.
  }
  return sum
}

console.log(multipleSum(1000))


推荐阅读