【发布时间】:2015-07-30 23:18:45
【问题描述】:
所以,我的问题是找到从 1 到 20 的所有数字的最小倍数。我确实成功地解决了这个任务,但我的程序运行得相当慢。这是代码,我使用的 n 的最终数字是 1 亿。 可以想象,这需要很多时间。所以我想知道,我将如何优化这段代码? 此外,很高兴知道如何更改它应该分成的数字的数量,所以不是 1 到 20,而是 1 到 15。
function smallestMultiple(n) {
for (i = 0; i< n; i++) {
if (i%1 === 0 && i%2 === 0 && i%3 === 0 && i%4 === 0 && i%5 === 0
&& i%6 === 0 && i%7 === 0 && i%8 === 0 && i%9 === 0
&& i%10 === 0 && i%11 === 0 && i%12 === 0 && i%13 === 0
&& i%14 === 0 && i%15 === 0 && i%16 === 0 && i%17 === 0
&& i%18 === 0 && i%19 === 0 && i%20 === 0 ) {
console.log(i);
}
};
};
现在,很明显,这需要 5 多分钟才能找到答案。我想知道是否有更有效的方法? 编辑:显然我也可以使用 1-20 的变量。将对此进行调查,如果您有答案,请彻底解释您的答案以及为什么它更有效。
【问题讨论】:
-
lcm(1, lcm(2, lcm(3, ...))),其中lcm是最小公倍数。 -
取你的最大数(在本例中为 20)并像这样更改你的 for:
for (i = 0; i< n; i +=20 ) -
当你找到第一个成功的号码时,你应该跳出
for循环。 -
您不必检查任何非质数的模数 -
%18是多余的,因为当i%9 == 0我们已经知道i%(9*2) == 0 -
您无需针对所有相互为倍数的数字进行测试。如果
n是 20 的倍数,那么它也是其所有因数的倍数,因此您无需测试 2、4、5 和 10。
标签: javascript algorithm modulo