我得到了一个数字,我需要找到该数字下方的 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/