Javascript 欧拉27号计划:有没有更好的方法来解决这个问题?

Javascript 欧拉27号计划:有没有更好的方法来解决这个问题?,javascript,algorithm,Javascript,Algorithm,我正在做这个问题。我的解决方案基本上就是循环使用每一个可能的选项并返回最好的 我知道嵌套循环不是最优的,可能有更聪明的方法来找到答案。但我想不出哪一个不是暴力。这是我的密码: var isPrime = function(num) { if (num <= 1) { return false; } // The check for the number 2 and 3 if (num <= 3) { return tru

我正在做这个问题。我的解决方案基本上就是循环使用每一个可能的选项并返回最好的

我知道嵌套循环不是最优的,可能有更聪明的方法来找到答案。但我想不出哪一个不是暴力。这是我的密码:

var isPrime = function(num) {
    if (num <= 1) {
        return false;
    }
    // The check for the number 2 and 3
    if (num <= 3) {
        return true; 
    }
    if (num % 2 == 0 || num % 3 == 0) {
        return false;
    }
    for (var i = 5; i * i <= num; i = i + 6) {
        if (num % i == 0 || num % (i + 2) == 0) {
            return false;
        }
    }
    return true;
}

var main = function () {
    var max = 0;
    var a = 0;
    var b = 0;
    for (var i = -999; i < 1000; i++) {
        for (var j = -1000; j <= 1000; j++) {
            var n = 0;
            while(1) {
                var temp = Math.pow(n, 2) + (n * i) + j;
                if (isPrime(temp)) {
                    if (n > max) {
                        max = n;
                        a = i;
                        b = j;
                    }
                } else {
                    break;
                }
                n++;
            }
        }
    }
    return a * b;
}

console.log(main());

谢谢

尽管该算法即使在JavaScript中也运行得非常快,但仍有一些地方需要优化

看看公式:x=n2+an+b

n将是奇数1,3,5。。。甚至2,4,6。。。。我们的目标是确保x总是奇数,因为除了2之外,没有偶数整数是素数

提醒注意规则 奇数*奇数=奇数3*7=21

奇数*偶数=偶数3*6=18

偶数*偶数=偶数4*8=32

奇数+奇数=偶数3+7=10

奇数+偶数=奇数3+6=9

偶数+偶数=偶数4+6=10

氮气 如果n是奇数,那么n的平方也将是奇数:12=1,32=9,52=25

如果n是偶数,那么n的平方也将是偶数:22=4,42=8,62=36

所以我们有奇偶交替的值

a*n 如果a为奇数,则:

对于奇数n,a*n是奇数 对于偶数n,a*n是偶数 所以我们又有奇数和偶数的交替值。 如果a是偶数,那么a*n总是偶数

n2+a*n 到目前为止,我们有n2+an,其中:

对于奇数a等于奇数+奇数=偶数或偶数+偶数=偶数;所以它总是平的 因为偶数a等于奇数+偶数=奇数或偶数+偶数=偶数;所以它是奇偶交替的 B 只剩下一个系数-b。它是一个常量,与上一个值相加应产生奇数值

这意味着我们必须忽略偶数a,因为一个常数加上交替奇数和偶数也会给出交替值,所以公式x只需几步就失败了

因为a必须是奇数,所以n+an是偶数

因此,要使x为奇数,我们必须取奇数b:偶数+奇数=奇数

总结
我们只需关注奇数a和奇数b值,这将限制要检查的案例数量大约为4=2*2。

我有一些一般性的评论:1我不确定你的素数检查算法如何,但通常在sqrtnum之前检查I就足够了。2您可以使用一个包含所有已检查素数的哈希表,以避免再次检查相同的数字;3 | a |<1000表示a从-999到999,而| b |好酷!谢谢你的反馈。1.我以为我是在循环结束时这样做的,老实说,我不知道你写的质数检查算法,所以我不确定1中的限制是否正确。你是自己发明的还是在什么地方发现的?我在这里发现了:对于素数优化:如果a和n都是偶数,b是奇数,那么x仍然是奇数,偶数+偶数+奇数,那么为什么a必须是奇数呢?因为你想从1开始测试n:1,2,3,4,…,所以n一次是奇数,另一次是偶数。这将随着n的变化而改变x的奇偶性。一旦你得到x,它甚至大于2,它就不是素数了。因此,即使是a,你也会得到很低的分数。