我正在尝试进行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;
}
答案 0 :(得分:0)
一种可能的方法是实施Sieve of Eratosthenes算法。 Example implementation here
但仅此一点还不够。您需要一直找到不重复的方法,或者仅针对问题搜索所需。
答案 1 :(得分:0)
我已经通过使用Sieve of Sundaram来实现这项工作,in this answer通常被认为比Eratosthenes的Sieve慢,但经过一点优化后,它的速度比最快的Sieve快了约2倍Eratosthenes在该问题下实施。在前1M个数字中找到78498个素数的时间不到25ms。
目前我正在研究这种算法的分段版本,它会产生;
一旦我完成了代码,我将根据我在该主题中的现有答案将其作为补充。