您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# JavaScript如何求数组中的质数
## 引言
在编程中,处理数组和数学计算是常见的任务。质数(只能被1和自身整除的自然数)的判断与筛选在算法题、密码学等领域有广泛应用。本文将详细介绍如何使用JavaScript从数组中筛选出质数,包括基础实现、性能优化和实际应用示例。
---
## 一、质数的定义与判断方法
### 1.1 质数的数学定义
质数是指大于1的自然数,且**只能被1和它本身整除**。例如:2, 3, 5, 7等。
### 1.2 判断质数的算法
常见方法有:
- **试除法**:检查从2到√n的所有整数是否能整除n。
- **埃拉托斯特尼筛法**:适合筛选一定范围内的质数(但对单个数的判断效率较低)。
---
## 二、JavaScript实现数组质数筛选
### 2.1 基础实现:试除法
```javascript
function isPrime(num) {
if (num <= 1) return false;
if (num === 2) return true;
for (let i = 2; i <= Math.sqrt(num); i++) {
if (num % i === 0) return false;
}
return true;
}
function filterPrimes(arr) {
return arr.filter(num => isPrime(num));
}
// 示例
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
console.log(filterPrimes(numbers)); // 输出 [2, 3, 5, 7]
除2外,所有偶数都不是质数,可以提前排除:
function isPrimeOptimized(num) {
if (num <= 1) return false;
if (num === 2) return true;
if (num % 2 === 0) return false;
for (let i = 3; i <= Math.sqrt(num); i += 2) {
if (num % i === 0) return false;
}
return true;
}
false
。const countPrimes = (arr) => filterPrimes(arr).length;
console.log(countPrimes([11, 12, 13, 14, 15])); // 输出 2
结合Array.from
生成数组:
function generatePrimesInRange(start, end) {
return Array.from({ length: end - start + 1 }, (_, i) => start + i)
.filter(num => isPrime(num));
}
console.log(generatePrimesInRange(10, 20)); // 输出 [11, 13, 17, 19]
对于超大型数组(如1e6个元素),可以用Web Worker避免阻塞主线程:
// worker.js
self.onmessage = function(e) {
const primes = e.data.filter(num => isPrime(num));
self.postMessage(primes);
};
// 主线程
const worker = new Worker('worker.js');
worker.postMessage(largeArray);
worker.onmessage = function(e) {
console.log('筛选结果:', e.data);
};
通过本文的代码示例和优化策略,你可以高效地在JavaScript中处理质数筛选问题。
// 最终优化版
const isPrime = (num) => {
if (num <= 1) return false;
if (num <= 3) return true;
if (num % 2 === 0 || num % 3 === 0) return false;
for (let i = 5; i * i <= num; i += 6) {
if (num % i === 0 || num % (i + 2) === 0) return false;
}
return true;
};
const filterPrimes = (arr) => arr.filter(isPrime);
”`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。