javascript - 求 3 和 5 的倍数之和,JS

标签 javascript optimization

我得到了一个数字,我需要找到该数字下方的 3 和 5 的倍数之和。 例如: 20 => 78 = 3 + 5 + 6 + 9 + 10 + 12 + 15 + 18

我的代码有效,但不适用于大于 1,000,000 的数字(我测试了 100,000 - 它给出了 2 秒延迟的结果)。所以,应该对其进行优化。有人可以帮我吗?为什么我的代码很慢?谢谢。

我的逻辑是这样的:

  • 向数组添加倍数
  • 过滤重复值
  • 对所有值求和

我的代码:

  function sumOfMultiples(number) {

    let numberBelow = number - 1;  
    let numberOfThrees = Math.floor(numberBelow / 3);
    let numberOfFives = Math.floor(numberBelow / 5);  
    let multiples = [];
    let multipleOfThree = 0;
    let multipleOfFive = 0;

    for (var i = 0; i < numberOfThrees; i++) {
      multiples.push(multipleOfThree += 3);
    }

    for (var j = 0; j < numberOfFives; j++) {
      multiples.push(multipleOfFive += 5);
    }

    return multiples
              .filter((item, index) => multiples.indexOf(item) === index)
              .reduce((a, b) => a + b);    
 }

最佳答案

您也可以在不使用任何循环的情况下执行此操作。

例如N为1000,则1000以内3的所有倍数之和为3 + 6 + 9 ..... 999 => 3( 1 + 2 + 3 .... 333)

与 5 类似,总和为 5(1 + 2 + 3 .... 200)。但我们必须减去公倍数,如 15、30、45(15 的倍数)

前N个自然数之和为N*(N+1)/2;

将所有这些放在一起

// Returns sum of first N natural numbers
const sumN = N => N*(N+1)/2; 

// Returns number of multiples of a below N
const noOfMulitples = (N, a) => Math.floor((N-1)/a);

function sumOfMulitples(N) {
    const n3 = noOfMulitples(N, 3);   // Number of multiples of 3 under N
    const n5 = noOfMulitples(N, 5);   // Number of multiples of 5 under N
    const n15 = noOfMulitples(N, 15); // Number of multiples of 3 & 5 under N
    return 3*sumN(n3) + 5*sumN(n5) - 15*sumN(n15);
}

关于javascript - 求 3 和 5 的倍数之和,JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57933934/

相关文章:

c - gcc 输出反汇编中的 data32 data32 nopw %cs :0x0(%rax, %rax,1) 指令的含义是什么?

javascript - 移动版 Safari : iframed form "next-input" on dropdown bug

php - 如何将 setInterval 与 mouseenter 结合起来?

javascript - 为什么 sortBy() 不起作用

c++ - 您可以链接使用不同优化级别编译的目标文件吗?

perl - 带内联的子程序 perl

javascript - 排列Javascript

javascript - Vue路由器工作不稳定

optimization - 如何有效地从 CUDA 中的线程收集数据?

optimization - GLSL 着色器中 cos() 和 sin() 函数的速度?