欧拉(Euler)项目27:是否有解决此问题的最佳方法?

时间:2019-07-10 05:56:14

标签: javascript

我正在回答Quadratic Primes问题。我的解决方案几乎是遍历所有可能的选项并返回最佳选项。

我知道嵌套循环不是最佳方法,并且可能有更聪明的方法来找到答案。但是我想不出不是蛮力的。这是我的代码:

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());

谢谢!

1 个答案:

答案 0 :(得分:1)

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

看看公式: x = n 2 + an + b

n将是 odd (1、3、5,...)和 even (2、4、6,...)。我们的目标是确保x始终为 odd ,因为除2以外的整数都不是素数。

规则提醒

奇数*奇数=奇数(3 * 7 = 21)

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

偶数*偶数=偶数(4 * 8 = 32)

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

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

偶数+偶数=偶数(4 + 6 = 10)

n 2

如果n是奇数 ,则n的平方也将是奇数:1 2 = 1,3 2 = 9,5 2 = 25,...

如果n even ,则n的平方也将是 even :2 2 = 4,4 2 = 8,6 2 = 36,...

所以我们有交替的 odd even 值。

a * n

如果a odd ,则:

  • 对于 odd na*n odd
  • 对于 even na*n even
  • 所以我们再次具有交替的 odd even 值。

如果a even ,那么a*n总是 even

n 2 + a * n

到目前为止,我们有 n 2 +一个,其中:

    对于 odd a
  • 等于 odd +奇数=偶数 even +偶数=偶数;所以总是 even
  • for even a等于 odd + even =奇数 even + even =偶数;因此它交替出现 odd even

b

仅剩一个系数-b。这是一个常数,将其添加到先前的值中会产生 odd 值。

这意味着我们必须忽略 even a,因为添加到交替的 odd even 值的常数也将给出交替的值,因此公式x仅需执行几步便会失败。

由于a必须为奇数,因此 n + 为偶数。

因此,要使x odd ,我们必须采用 odd b even +奇数=奇数

摘要

我们只需要关注 odd a odd b的值,这将使要检查的案件数量大约减少4个(= 2 * 2)。