【问题标题】:trying to find Prime numbers in an array试图在数组中找到素数
【发布时间】:2017-06-14 00:40:30
【问题描述】:

我想从数组中删除非素数,以下仅删除偶数而不是素数。

function sumPrimes(num) {
  //Produce an array containing all number of to and including num
  let numArray = [];
  for (let i = 1; i <= num; i++) {
    numArray.push(i);
  }

  //Remove non-prime numbers from the array     
  numArray.map((number) => {
    for (let i = 2; i < number; i++) {
        if(number % i === 0) {
            let index = numArray.indexOf(number);
            return numArray.splice(index, 1);       
        }
    }   
  });

 return numArray;

}

sumPrimes(10);

目前正在返回:

[1, 2, 3, 5, 7, 9]

但是,质数是 1、2、3、5、7(不包括 9);

【问题讨论】:

  • 我的输出是 4, 6, 8, 9, 10,这是正确的。您已将其编程为在找到可整除的数字而不是不可整除的数字时打印。
  • map 不会删除任何内容。你的意思是filter?不要在循环中使用splice
  • 您的回调需要return 一些有意义的东西,而不是undefined

标签: javascript


【解决方案1】:

改用filter()

var numArray = [2, 3, 4, 5, 6, 7, 8, 9, 10]

numArray = numArray.filter((number) => {
  for (var i = 2; i <= Math.sqrt(number); i++) {
    if (number % i === 0) return false;
  }
  return true;
});

console.log(numArray);

【讨论】:

  • 谢谢,我应该使用过滤器而不是地图。顺便说一句,我不需要使用 Math.sqrt(number);
  • 好的,但是对于更大的数字,它要快得多。检查 97 是否是 100 的因数没有多大意义。
【解决方案2】:

previous answer 不适用于负数。

如您所见here,查找素数的最简单方法是:

const array = [-5, -3, -2, -1, ...Array(20).keys()]; 
// Array(20).keys() generates numbers from 0 to 19.

function isPrime(num) {
  for (let start = 2; num > start; start++) {
    if (num % start == 0) {
      return false;
    }
  }
  return num > 1;
}

console.log(array.filter(isPrime)); // [2, 3, 5, 7, 11, 13, 17, 19]

【讨论】:

  • 嗯,我这样做是为了 [...Array(10).keys()];但它返回的不是素数 9
  • @pinglinh:是的,你是对的,我编辑了代码。非常感谢您测试我的代码。
【解决方案3】:

Farnaz Kakhsaz 的回答效果很好,但速度很慢。你只需要检查直到'num'的根。谢谢!

const array = [-5, -3, -2, -1, ...Array(20000).keys()]; 

function isPrime(num) {
  for (let i = 2; i <= Math.sqrt(num); i++) {
    if (num % i === 0) {
      return false;
    }
  }
  return num > 1;
}

console.log(array.filter(isPrime));

【讨论】:

    【解决方案4】:

    我在 javascript 中使用 forEach() 在数组中查找素数的解决方案。

    let num = [-1,-2,-3,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
    let result = [];
    function isPrime(num) {
      if(num < 2) return false;
    
      for (let k = 2; k < num; k++){
        if(num % k == 0){
          return false;
        }
      }
      return true;
    }
    num.forEach(function (element) {
      const item = isPrime(element);
      if (item) {
        result.push(element);
      }
    });
    console.log(result); // [ 2, 3, 5, 7, 11, 13, 17, 19]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多