Discuss / JavaScript / 交作业,相对执行次数较少的一种处理方案

交作业,相对执行次数较少的一种处理方案

Topic source

此处只给出函数内部定义

    // 首先把 1 过滤掉
    arr = arr.filter(function (x) {
        return x > 1;
    });
    // 定义遍历函数
    let f = function (bar, index, self) {
        return (foo >= index) || (bar % self[foo] > 0);
    }
    // 执行
    for (var foo = 0; foo < arr.length; foo++) {
        arr = arr.filter(f);
    }
    return arr;

改进

results = arr.filter(function (x) {
  for (let start = 2, end = x; end > start; start++) {
    if (x % start === 0) {
      return true
    }
    end = x / start - 1
    if (x % end === 0) {
      return true
    }
  }
  return false
})

。。。好想撤销呀,写反了,还漏了个条件

results = arr.filter(function (x) {
  if (x < 2) {
    return false
  }
  for (let start = 2, end = x; end > start; start++) {
    if (x % start === 0) {
      return false
    }
    end = x / start - 1
    if (end > start && x % end === 0) {
      return false
    }
  }
  return true
})

感觉还是这样更好,少做很多无用功

results = arr.filter(function (x) {
  if (x < 2) {
    return false
  }
  for (let start = 2, end = Math.sqrt(x); start <= end; start++) {
    if (x % start === 0) {
      return false
    }
  }
  return true
})

参考网上资料:

results = arr.filter(function (x) { // 求素数
  if (![1, 5].includes(x % 6) && ![2, 3].includes(x)) {
    return false // 只有形如 6n-1 和 6n+1 的自然数可能是素数
  }
  for (let start = 2, end = Math.sqrt(x); start <= end; start++) {
    if (x % start === 0) {
      return false
    }
  }
  return x !== 1
})

埃拉托斯特尼算法

let getPrimeNum = function (arr) {
  let max = arr.reduce((a, b) => Math.max(a, b), 0) // 获取数组中最大值
  let primeNums = []
  function isPrime(num) { // 用已有的素数判断新元素是否为素数
    for (var primeNum of primeNums) {
      if (num % primeNum === 0) {
        return false
      }
    }
    return true
  }
  for (let num = 2; num <= max; num++) {
    if (isPrime(num)) {
      primeNums[primeNums.length] = num
    }
  }
  return arr.filter((x) => primeNums.includes(x))
}
arr = getPrimeNum(arr)

  • 1

Reply