![](/img/trans.png)
[英]JavaScript Prime Checker Function with Ternary Operator Syntax
[英]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
。 所以你刪除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
}
正如邁克所說,在修改數組時使用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.