将给定数组转换为布尔数组,其中如果数字是素数,则每个元素为真,否则为假
convert the given array to an array of Boolean where Each element is true if the number is a prime number, and false otherwise
我需要找出数组中的某个数是否为素数。一开始我认为这很容易,但是.. :)
首先我尝试了这个版本:
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]
我该怎么办? :/
这样...
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 = 1 // modulo initial assignement must be there
for (let j = 2; j < el; j++) // or (let j=3; j<el; j +=2)
{ // see Alexey Zelenin explanations
modulo = el % j
if (modulo === 0)
{
result.push(false)
break // this other one is missing in your code
}
}
if (modulo !== 0) result.push(true) // test last modulo value
} // outside the loop (and it's scope)
}
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;
}
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
添加到答案列表时,每个检查都会立即完成。
更新:添加了Math.abs
函数调用,因此负数将被正确处理。
我需要找出数组中的某个数是否为素数。一开始我认为这很容易,但是.. :)
首先我尝试了这个版本:
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]
我该怎么办? :/
这样...
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 = 1 // modulo initial assignement must be there
for (let j = 2; j < el; j++) // or (let j=3; j<el; j +=2)
{ // see Alexey Zelenin explanations
modulo = el % j
if (modulo === 0)
{
result.push(false)
break // this other one is missing in your code
}
}
if (modulo !== 0) result.push(true) // test last modulo value
} // outside the loop (and it's scope)
}
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;
}
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
添加到答案列表时,每个检查都会立即完成。
更新:添加了Math.abs
函数调用,因此负数将被正确处理。