我的主要检查器不起作用。我认为可以通过更简单的方法来应对这一挑战,但是我需要的功能是:
对于给定的数p:
1)用2到p填充数字numArray
我已经做到了:
for (var i=2; i<(p + 1); i++) {
numArray.push(i);
};
2)当numArray不为空时:
将numArray中的第一个数字'prime'添加到数组primeArray
从numArray拼接素数的每个倍数
我的代码不使用while循环,因为我不确定如何使用一个来循环访问数组,但是for循环也不起作用?
人们可以仅仅对建议做出回应,而不是完全解决。绝对请不要编写能找到质数的完整代码。我更想知道如何遍历数组,并根据数组的元素以及有关如何构造代码的其他任何指针进行迭代。
我也很困惑为什么
(numArray[k] % prime == 0)
似乎错过了数字?
function checkIfPrime(p) {
numArray = [];
primeArray = [];
for (var i = 2; i < (p + 1); i++) {
numArray.push(i);
};
for (var j = 0; j < numArray.length; j++) {
if (primeArray.indexOf(numArray[j]) === -1) { //if numArray of j is not already in primeArray
var prime = numArray[j];
console.log(prime + " is not in numArray")
primeArray.push(prime);
console.log(primeArray);
numArray.splice(j, 1);
console.log(numArray);
for (var k = 0; k < numArray.length; k++) {
if (numArray[k] % prime == 0) {
numArray.splice(k, 1);
};
}
}
};
}
p = 5;
console.log(checkIfPrime(p));
最佳答案
由于您对建议的兴趣大于对工作代码的兴趣,因此让我们从替代方法开始。
问题是,当您从数组中拼接一个项目时,它会更改其长度。它没有新内容,但是问题是,您正在同一数组上进行迭代。
因此,对于给定的数组[2, 3, 4, 5]
,如果j
为0,则prime
将为2
。因此,您删除了2
和4
。因此,新长度为2。问题是其余元素将被移动。因此它看起来像[3, 5]
。
现在在迭代中,j
将是1
。因此它将从5
开始并跳过5。
选择:
而不是删除元素,而是将它们分配给默认值,该默认值将默认被跳过。这样,您的索引将保持正确,并且逻辑将很简单。
function checkIfPrime(p) {
var numArray = [];
var primeArray = [];
for (var i = 2; i < (p + 1); i++) {
numArray.push(i);
};
for (var j = 0; j < numArray.length; j++) {
if (numArray[j] !== 0 && primeArray.indexOf(numArray[j]) === -1) { //if numArray of j is not already in primeArray
var prime = numArray[j];
primeArray.push(prime);
for (var k = 0; k < numArray.length; k++) {
if (numArray[k] % prime == 0) {
numArray[k] = 0;
};
}
}
};
console.log(primeArray)
}
p = 5;
console.log(checkIfPrime(p));
从numArray拼接素数的每个倍数
最简单的方法是使用
Array.filter
。如果在循环本身时操纵数组,它将使逻辑复杂化。同样,对象应该是不可变的。因此,您可以遍历数组并创建具有必要值的临时数组,然后替换该值。可以使用
array.filter
甚至使用for
来完成。numArray = numarray.filter(function(num){
return num % prime !== 0;
})
假设
numArray
将具有可能的质数,我们可以尝试将明显的非候选数减到最少。var numArray = [2, 3];
for (var i = 8; i<=p; i++) {
if(i % 2 !== 0 || i % 3 !== 0) {
numArray.push(i)
}
}
另外,由于质数是固定的,因此我们可以假定一个长度和预计算的质数表。如果用户输入更大的数字,则只需计算从限制到新限制的数字。这样,您可以节省一些处理时间:
var numArray = [2, 3];
function computePrimes(limit) {
var init = numArray[numArray.length - 1] || 0;
for (var i = init; i<= limit; i++) {
if(isPrime) {
numArray.push(i);
}
}
}
function isPrime(num) {
for (var i = 3; i< num; i++) {
if(num % i === 0)
return true;
}
else false;
}
computePrimes(100);
function getPrimeNumbers(num) {
if(num > numArray[numArray.length - 1]) {
computePrimes(num);
}
// ... Your computation logic
}
关于javascript - JavaScript Prime检查器不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47078828/