如果我的目标是前者中的第一个元素和后者中的最后一个元素,为什么unshift()返回的值与push()不同



我有一个用于Project Euler#7的函数。最后,我将代码从primeArray.push(i);更改为primeArray.unshift(i),将return primeArray[primeArray.length - 1];更改为return primeArray[0];。这改变了回报。在前者。它返回了正确的答案104021,而后者返回了20001,这甚至不是素数。我不明白为什么。

function primeFinder(primeTarget) {
//since 2 is the only even prime, putting it here saves us some effort in checking primality by just iterating over the odd numbers
//it also helps the for loop since we are only interested in checking for divisors among previous primes.
let primeArray = [2];
let i = 3;
while (primeArray.length < primeTarget) {
let primeLogger = false;
//We don't need to check for divisibility by 2, so j can equal 1
for (j = 1; j < primeArray.length && primeArray[j] < Math.sqrt(i); j++) {
if (i % primeArray[j] === 0) {
primeLogger = true;
//Since we have found a divisor and changed primeLogger, we can exit the loop
break;
}
}
//Where the break goes to, and also where the for loop goes to once finishes
if (primeLogger === false) {
primeArray.push(i);
}
i += 2;
}
return primeArray[primeArray.length - 1];
}
console.log(primeFinder(10001));

因为primeArray现在是按降序排列的,但循环仍然从头到尾搜索;现在从最大值到较小值。直到它找到>= Math.sqrt(i),这很可能是第一次检查j=1
然后以primeLogger === false结束循环

例如:

i=9, j=1
primeArray === [7,5,3,2]
primeArray[j] === 5

并且由于校验5 < Math.sqrt(9)false,所以循环结束。

因此CCD_ 11是素数,并且现在被添加到CCD_。

最新更新