JavaScript—Euler#5项目—效率

JavaScript—Euler#5项目—效率,javascript,math,Javascript,Math,这是欧拉计划的问题#5 任务是找到能被数字1-20整除的最小数字。我的代码似乎在1-18上运行,但在19时,我的浏览器开始超时。这让我相信我的代码效率很低 我如何减轻这种影响 function divisible(a){ counter = 0; result = 2; while (counter < a){ for (var x = 0; x <= a; x ++){ if (result % x === 0){

这是欧拉计划的问题#5

任务是找到能被数字1-20整除的最小数字。我的代码似乎在1-18上运行,但在19时,我的浏览器开始超时。这让我相信我的代码效率很低

我如何减轻这种影响

function divisible(a){
    counter = 0;
    result = 2;
    while (counter < a){
        for (var x = 0; x <= a; x ++){
            if (result % x === 0){
                counter ++;
            }
        }
        if (counter != a){
            counter = 0;
            result ++;
        }
    }
    return result;
}
divisible(20)
可除函数(a){
计数器=0;
结果=2;
while(计数器对于(var x=0;xYup,低效。您需要更改算法。我能想到的最有效的方法是将2到20之间的所有数字分解(带因子和计数:例如,18是3*3*2,或两倍3和一倍2,对于final
{3:2,2:1}
),然后找到每个因子的最大值,并将它们相乘

一个简短的例子:可被18和16整除的最小数:

18: { 3: 2, 2: 1 }
16: { 2: 4 }

maximums of factor repetitions: { 3: 2, 2: 4 }
result: 3^2 * 2^4 = 144
将数字从2分解到20是很容易的;如果你不知道怎么做,有很多可能的算法,你可以看看它们的想法。

基本上,你想要的是1,…,20

我将通过使用实现
lcm
,这可以通过fast实现

功能gcd(a、b){
返回b==0?a:gcd(b,a%b);//欧几里德算法
}
功能lcm(a、b){
返回a*b/gcd(a,b);
}
可除函数(a){
var结果=1;
对于(var i=2;i
另一个选项是蛮力和模静止分类

这个问题可以用一个简单的通用模rest类特性来解决。 看看从1到20的数字,把它分成两组,找出它们之间的一些独特的共同属性

12345678910

   we are building a division with the same reminder members
一分为二

2除以4,8-->>8重要

3除以6,9,但6不能平均除以9-->6,9

5除10-->>10重要

这就剩下6,7,8,9,10来检查是否有从1开始的任何数字可以将其与剩余的0分开

诀窍是,如果2,4,8除以一个数字,比如说16,并且有相同的提示,那么我们不必检查2,4是否除以16,我们只检查8

11121314151617181920

在这里,我们可以用上面的数字的因子做同样的事情,剩下的就是

11121314151617181920

注:我们知道最后一个必须除以数字的数字是20, 这意味着要么解决方案是以0结尾的数字,要么是 其中一个因子是20,所以我们构建因子20并检查11是否为12 13 14 15 16 17 18 19可以将其分开,那么我们就完成了

同样的想法也适用于我做的第一个推论 问题似乎更小

//可被1到10之间的所有数字整除的最小数

int a = 10;

    while (a % 6 != 0 || a % 7 != 0 | a % 8 != 0 || a % 9 != 0 )
    {
        a += 10;
    }

console.log(a)
//可被1到5的所有数字整除的最小数

int i = 5;                          

    while (i % 3 != 0 || i % 4 != 0)
    {
        i += 5;
    }

console.log(i)

效率低下有一个数学原因,但这与JavaScript和代码无关。你是指我只是手动划分每个迭代的事实吗?好吧,对于初学者来说,即使你知道数字不会通过,你也在浪费大量时间检查数字。第一次
结果%x!==0
,你你已经知道这不是答案,但你一直在测试其余的数字。另一方面,你在测试0的可除性,它总是返回
NaN
,所以你可能应该用一个合法的除数开始测试。最后,你在测试你不需要测试的东西;你知道结果必须是16的可除性(例如),这意味着您不需要测试1、2、4或8,因为16的可除性自然包含其他部分。谢谢!我已经处于第二位的尖端,但我在将其转换到循环中时遇到了很多困难。不过,我想这就是我现在需要重点关注的地方。好吧,有比我建议的更好的解决方案;我是o我们只提供了一些方法来减少对朴素解决方案的浪费计算,但朴素解决方案仍然是朴素的。基于计算每个预期除数的最大素数因子幂的乘积的解决方案可以为您提供分解20个非常小的数的成本的答案,这比迭代猜测和检查方法要便宜得多h、 也就是说,对于一个如此小的问题,即使是一个轻度优化的Naiver解决方案也能很快解决。不过,后面的问题需要更大的数字;Naiver不会解决这个问题。谢谢你的建议!我肯定要做一些研究来解决这种类型的解决方案,但我正在努力!
int i = 5;                          

    while (i % 3 != 0 || i % 4 != 0)
    {
        i += 5;
    }

console.log(i)