我需要找出一個數字是素數還是不在陣列中。一開始我認為這很容易,但是.. :)
首先我嘗試了這個版本:
function primeValues(arr) {
let newArr = []
for( let el of arr) {
if (el <= 2 ) {
newArr.push(true)
}
for (let j=2; j<el; j ) {
if (el%j === 0) {
newArr.push(false)
}
if (el%j !==0 ) {
newArr.push(true)
}
}
}
return newArr;
}
console.log(primeValues([17, 3, 21]));
但是每次它通過時for loop,它都會推入我True的False新陣列:/`
(35) [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true]
我該怎么辦?:/
uj5u.com熱心網友回復:
function primeValues(arr) {
return arr.map(element => {
const x = Math.abs(element);
if(x <= 2) return true;
if(x % 2 === 0) return false;
for(let i = 3; i <= Math.sqrt(x); i =2) {
if(x % i === 0) {
return false;
}
}
return true;
});
}
console.log(primeValues([7,9,11,13,-21,2,54]));
我在代碼中添加了一些優化
- 我們只檢查奇數,因為如果一個元素還不能被 2 整除,它就不能被偶數整除。
- 我們不需要檢查所有小于“元素”的數字——我們只需要檢查從 3 到元素平方根的數字。如果你需要任何額外的解釋為什么 - 我可以給它。
- 我建議使用“map”而不是創建一個陣列并推到那里——它更有效。此外,它還可以保護您避免丟失“else”和“break”陳述句 - 每項檢查在添加
true或false添加到答案串列時立即完成。
UPD:添加Math.abs了函式呼叫,因此將正確處理負數。
uj5u.com熱心網友回復:
這邊走...
console.log( JSON.stringify( primeValues([17, 3, 21] )))
function primeValues(arr)
{
let result = [], modulo;
for( let el of arr)
{
if (el <= 2 )
result.push(true)
else // this one is missing in your code
{
modulo = 0 // modulo assignement must be there
for (let j = 2; j < el; j )
{
modulo = el % j
if (modulo === 0)
{
result.push(false)
break // this other one is missing in your code
}
}
if (modulo !== 0) result.push(true) // outside the loop
}
}
return result;
}
但您可能更喜歡這樣撰寫代碼:
console.log( JSON.stringify( primeValues([ 17, 3, 21 ] )))
function primeValues(arr)
{
let result = []
, isNotPrim
;
for (let el of arr)
{
isNotPrim = false
if (el > 2)
for (let j = 2; j < el; j )
if (isNotPrim = !(el %j))
break
;
result.push( !isNotPrim )
}
return result;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/429686.html
標籤:javascript 数组 for循环 布尔值 素数
上一篇:如何按降序對兩個陣列進行排序?
