【发布时间】:2017-05-23 02:14:23
【问题描述】:
我正在尝试 codewars.com 挑战,但在提高代码效率方面遇到了一些问题。挑战的指令是找到一个范围内的所有素数,然后我必须找到两个素数,它们之间有一个指定的间隔。
我编写了一个有效的算法,但完成所有测试用例所需的时间太长。可以看下面的代码:
function gap(g, m, n) {
// your code
var stopNumber;
var checkIfInteger;
var primeNumbersInRange = [];
var arrayIndex = 0;
var gap;
//iterate through all of the numbers in the range and find if they're prime
for( var numberToCheck = m; numberToCheck <= n; numberToCheck++){
var checkedTwoAndThreePass = true;
checkIfInteger = numberToCheck / 2;
if(Number.isInteger(checkIfInteger)){
checkedTwoAndThreePass = false;
}
checkIfInteger = numberToCheck / 3;
if(Number.isInteger(checkIfInteger)){
checkedTwoAndThreePass = false;
}
if(checkedTwoAndThreePass){
var k = 1;
var primeNumberCheck = true;
stopNumber = Math.sqrt(numberToCheck);
while( ((6 * k) - 1) <= stopNumber & primeNumberCheck === true ){
checkIfInteger = numberToCheck / ((6 * k) - 1);
if(Number.isInteger(checkIfInteger)){
primeNumberCheck = false;
}
else{
checkIfInteger = numberToCheck / ((6 * k) + 1);
if(Number.isInteger(checkIfInteger)){
primeNumberCheck = false;
}
}
k++;
}
if(primeNumberCheck === true){
primeNumbersInRange[arrayIndex] = numberToCheck;
arrayIndex++;
}
}
}
for(var i = 0; i < primeNumbersInRange.length; i++){
gap = primeNumbersInRange[(i+1)] - primeNumbersInRange[i];
if(gap === g){
var primeNumbersThatMeetGap = [primeNumbersInRange[i], primeNumbersInRange[(i+1)]];
return primeNumbersThatMeetGap;
}
}
var primeNumbersThatMeetGap = null;
return primeNumbersThatMeetGap;
}
【问题讨论】:
-
这个问题的约束是什么(范围的界限可以有多大)?
-
一个基本的en.wikipedia.org/wiki/Sieve_of_Eratosthenes 可以避免许多重复检查。由于需要找到“所有”素数..
-
你能决定缩进风格并相应地清理你的代码吗?此外,您有一个
&,您可能想要一个&&。检查 jshint.com 上的代码并修复所有错误。 -
@BrunoLM 是的,就是那个。
标签: javascript algorithm performance