超级丑数--用查找的api解决


质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。
质因数(素因数或质因子)在数论里是指能整除给定正整数的质数。除了1以外,两个没有其他共同质因子的正整数称为互质。因为1没有质因子,1与任何正整数(包括1本身)都是互质
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但7.14不是,因为它们包含质因子7。 习惯上我们把1当做是第一个丑数

class Ugly {
  constructor(n, primes) {
    this.n = n
    this.primes = primes
  }
  getAll() {
    // 超级丑数列表
    let res = [1]
    let i = 2
    let primes = this.primes
    // 不知道上限用while循环
    while (res.length < this.n) {
      let arr = Ugly.getPrimies(i)
      let k = 0
      let l = arr.length
      for (; k < l; k++) {
        if (!primes.find(item => item === arr[k])) {
          break
        }
      }
      // k===l有两种情况,1.压根没有质因数,2.质因数都在指定列表中
      if (k === l) {
        if (l === 0) {
          if (primes.find(item => item === i)) {
            res.push(i)
          }
        } else {
          res.push(i)
        }
      }
      i++
    }
    // 返回丑数数组
    return res[this.n - 1]
  }
  // 计算指定正整数n的质因数
  static getPrimies(n) {
    let prime = (n) => {
      let arr = []
      for (let i = 2; i < n / 2 + 1; i++) {
        // 求质数利用递归,因为返回的是一个arr数组,当数组为空时说明是质数
        if (n % i === 0 && !prime(i).length) {
          arr.push(i)
        }
      }
      return arr
    }
    return prime(n)
  }
}

export default Ugly

posted @ 2020-08-10 15:21  额头有王的喵  阅读(127)  评论(0编辑  收藏  举报