我正在回答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());
谢谢!
答案 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
是奇数 ,则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
是 odd ,则:
n
,a*n
是 odd n
,a*n
是 even 如果a
是 even ,那么a*n
总是 even 。
到目前为止,我们有 n 2 +一个,其中:
a
,a
等于 odd + even =奇数或 even + even =偶数;因此它交替出现 odd 和 even 仅剩一个系数-b
。这是一个常数,将其添加到先前的值中会产生 odd 值。
这意味着我们必须忽略 even a
,因为添加到交替的 odd 和 even 值的常数也将给出交替的值,因此公式x
仅需执行几步便会失败。
由于a
必须为奇数,因此 n + 为偶数。
因此,要使x
为 odd ,我们必须采用 odd b
: even +奇数=奇数。
我们只需要关注 odd a
和 odd b
的值,这将使要检查的案件数量大约减少4个(= 2 * 2)。