簡體   English   中英

JavaScript Prime檢查程序無法正常工作

[英]JavaScript Prime checker not working

我的主要檢查工作不起作用。 我認為有更簡單的方法來應對這一挑戰,但我需要的功能是:

對於給定的數字p:

1)用數字從2到p填充數組numArray

我已經實現了這個:

for (var i=2; i<(p + 1); i++) {
    numArray.push(i);
  };

2)雖然numArray不為空:

  • 將numArray中的第一個數字'prime'添加到數組primeArray中

  • 從numArray中拼接每個素數倍數

我的代碼不使用while循環,因為我不確定如何使用一個迭代數組,但for循環也不起作用?

CAN PEOPLE肯定會回應建議,而不是完全修復。 絕對請不要寫完整的代碼來查找素數。 我更有興趣知道如何根據數組的元素迭代我繼續切片的數組,以及關於如何構造我的代碼的任何其他指針。

我也很困惑為什么

(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
}

正如邁克所說,在修改數組時使用for循環迭代數組通常是個壞主意。

我認為有兩種方法可以解決這個問題:

手動管理迭代變量並確保僅在需要時遞增。

或者使用數組的過濾方法。 這是一個幫助您入門的基本示例:

[1,2,3].filter(function(x){return x != 2})
// Will return [1,2]

請記住,這將返回一個帶有過濾值的新數組,因此您必須通過執行類似numArray = numArray.filter(...)來重新放置它numArray = numArray.filter(...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM