我的主要检查器不起作用。我认为可以通过更简单的方法来应对这一挑战,但是我需要的功能是:

对于给定的数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。因此,您删除了24。因此,新长度为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/

10-09 17:21