📅  最后修改于: 2023-12-03 15:37:42.957000             🧑  作者: Mango
本文介绍如何在一个给定的数组中找出所有的质数(素数),并计算它们的和。
质数是指大于1的自然数,除了1和自身以外,不能被其他自然数整除的数。例如,2、3、5、7、11等都是质数。
我们可以使用以下步骤来找出数组中的质数:
以下是实现该算法的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
函数的实现,避免了不必要的循环。在实际使用中,这个函数可以显著提高算法的性能。