📜  在数组中打印质数和质数之和(1)

📅  最后修改于: 2023-12-03 15:37:42.957000             🧑  作者: Mango

在数组中打印质数和质数之和

本文介绍如何在一个给定的数组中找出所有的质数(素数),并计算它们的和。

什么是质数?

质数是指大于1的自然数,除了1和自身以外,不能被其他自然数整除的数。例如,2、3、5、7、11等都是质数。

程序实现

我们可以使用以下步骤来找出数组中的质数:

  1. 创建一个空数组,用来存储找到的质数。
  2. 遍历给定的数组。
  3. 对于每个数,判断它是否是质数。如果是,将它添加到质数数组中。
  4. 遍历质数数组,计算它们的和。

以下是实现该算法的JavaScript代码:

// 判断是否是质数
function isPrime(num) {
  if (num < 2) {
    return false;
  }
  for (let i = 2; i <= Math.sqrt(num); i++) {
    if (num % i === 0) {
      return false;
    }
  }
  return true;
}

// 寻找数组中的质数并计算它们的和
function findPrimesAndSum(arr) {
  const primes = [];
  let sum = 0;
  for (let i = 0; i < arr.length; i++) {
    if (isPrime(arr[i])) {
      primes.push(arr[i]);
      sum += arr[i];
    }
  }
  console.log(`Primes: ${primes.join(", ")}`);
  console.log(`Prime sum: ${sum}`);
}

// 测试
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
findPrimesAndSum(arr); // Primes: 2, 3, 5, 7, 11 Prime sum: 28

我们首先定义了一个isPrime函数来判断一个数是否是质数。然后,我们定义了一个findPrimesAndSum函数来寻找数组中的质数并计算它们的和。该函数通过遍历数组,对于每个数调用isPrime函数来判断是否是质数,如果是,则将它添加到primes数组中,并将它的值加到sum中。最后,我们打印出所有找到的质数和它们的和。

现在,我们可以调用findPrimesAndSum函数来在任何数组中找出质数并计算它们的和。

性能优化

以上实现虽然正确,但在处理大数组时可能会变得很慢。这是因为我们每次使用isPrime函数来判断一个数是否是质数时,都要从头到尾地遍历该数的所有可能因子。但是,如果我们改变算法,只需要检查该数的小于其平方根的因子,就可以提高性能。

以下是优化后的实现:

// 判断是否是质数(优化版)
function isPrime(num) {
  if (num < 2) {
    return false;
  }
  if (num === 2 || num === 3) {
    return true;
  }
  if (num % 2 === 0 || num % 3 === 0) {
    return false;
  }
  let i = 5;
  const max = Math.sqrt(num);
  while (i <= max) {
    if (num % i === 0 || num % (i + 2) === 0) {
      return false;
    }
    i += 6;
  }
  return true;
}

我们修改了isPrime函数的实现,避免了不必要的循环。在实际使用中,这个函数可以显著提高算法的性能。