[ CodeWar ] - 003:判断质数

446 阅读2分钟

系列文章

题目

本来应该是在 CodeWar 拿下一道题,不过在群里看到一道也差不多意思的题目,就顺手放在 CodeWar 系列里了。

先来看看题目:

img-01

解析

由于是小测题,所以这里就默认输入为正整数了。

问题核心很明显,就是判断输入的数是不是质数,而质数的特征是:

  • 大于 1
  • 只能被 1 和自身整除

综合上述条件,我们需要实现的方法只需要进行如下操作即可:

  • Step 1:判断值是否为 0 或 1,如果是则返回 false
  • Step 2:遍历这个数值,每一次遍历,判断当前的值与传入的正整数取余是否为 0,如果有 0 则返回 true
  • Step 3:遍历结束也没有遇到 0,则返回 false

那么按照步骤将代码一步一步书写出来即可:

const isPrime = n => {
  if ([01].includes(n)) {
    return false
  } else {
    for (let i = 2; i < n; i++) {
      if (n % i === 0) {
        return true
      }
    }
  }
  return false
}

emmmmm...这代码真是便秘。

来想想怎么进行优化:

  • 首先遍历操作,数组用起来更舒服,那么可以想办法将这个数字转化成数组来遍历
  • 其次判断一个质数,真的需要将其整个遍历结束吗?事实上只需要遍历其开根之后的值 +1 即可
  • 另外,因为遍历数组的方法是函数,所以 return 之后还是在 isPrime,那么我们可以想到通过 map 来整合,判断遍历结束的数组中是否存在 true

综上,我们来优化一下代码:

const isPrime = n => {
  const sqrtNum = Math.floor(Math.sqrt(n) + 1)
  return [01].includes(n) ? false : [...Array(n).keys()].slice(2, sqrtNum).map(i => !(n % i)).includes(true)
}

当然,既然都已经这样了,我们可以再把它写的更加精简一点:

const isPrime = n => [01].includes(n) ? false : [...Array(n).keys()].slice(2Math.floor(Math.sqrt(n) + 1)).map(i => !(n % i)).includes(true)