
用JavaScript求素数的方法有很多种,常见的包括:试除法、埃拉托斯特尼筛法、分区筛法。其中,试除法由于其简单易懂,常常被用作初学者的入门方法。以下是针对试除法的详细描述:试除法是一种判断一个数是否为素数的基本方法。其核心思想是:一个数如果不能被小于等于其平方根的所有素数整除,那么它就是一个素数。
一、试除法
1、基本原理
试除法的基本原理是通过除以小于等于该数平方根的所有数来判断一个数是否为素数。如果在这个范围内找不到可以整除的数,那么这个数就是素数。该方法的时间复杂度为O(√n),适用于判断较小的数是否为素数。
2、代码实现
function 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;
}
// 测试
console.log(isPrime(11)); // true
console.log(isPrime(15)); // false
3、优化思路
试除法虽然简单,但对于大数的判断效率较低。可以通过以下方式进行优化:
- 仅检查到平方根:只需要将检查的范围缩小到平方根以内即可。
- 跳过偶数:因为偶数不可能是素数(除了2),所以可以跳过偶数的检查。
二、埃拉托斯特尼筛法
1、基本原理
埃拉托斯特尼筛法是一种高效的筛选素数的方法。其核心思想是:从2开始,将每个素数的倍数标记为合数。最后,未被标记的数即为素数。
2、代码实现
function sieveOfEratosthenes(max) {
let sieve = new Array(max).fill(true);
sieve[0] = sieve[1] = false; // 0和1不是素数
for (let i = 2; i * i <= max; i++) {
if (sieve[i]) {
for (let j = i * i; j <= max; j += i) {
sieve[j] = false;
}
}
}
return sieve
.map((isPrime, index) => (isPrime ? index : null))
.filter((num) => num !== null);
}
// 测试
console.log(sieveOfEratosthenes(30)); // [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
3、优化思路
虽然埃拉托斯特尼筛法相比试除法有了很大提升,但其空间复杂度较高,对于超大范围的素数筛选依然有些力不从心。可以通过以下方式进行优化:
- 分区筛法:将筛选范围划分为若干小区间,逐个筛选,每次只需要标记当前区间内的合数。
三、分区筛法
1、基本原理
分区筛法是一种改进的筛选素数的方法,通过将筛选范围划分为若干小区间,逐个筛选,每次只需要标记当前区间内的合数。该方法适用于超大范围的素数筛选。
2、代码实现
function segmentedSieve(max) {
const limit = Math.floor(Math.sqrt(max)) + 1;
const primes = sieveOfEratosthenes(limit);
let low = limit;
let high = 2 * limit;
const mark = new Array(max).fill(true);
while (low < max) {
if (high >= max) high = max;
mark.fill(true);
for (let i = 0; i < primes.length; i++) {
const loLim = Math.floor(low / primes[i]) * primes[i];
for (let j = loLim; j < high; j += primes[i]) {
mark[j - low] = false;
}
}
for (let i = low; i < high; i++) {
if (mark[i - low]) console.log(i);
}
low = low + limit;
high = high + limit;
}
}
// 测试
segmentedSieve(100); // 输出100以内的所有素数
3、优化思路
分区筛法是对埃拉托斯特尼筛法的优化,可以有效降低空间复杂度,但其实现相对复杂,需要精细的范围划分和标记操作。
四、总结
通过上述方法,可以高效地使用JavaScript求解素数问题。试除法适用于小范围素数判断,埃拉托斯特尼筛法适用于中等范围素数筛选,分区筛法则适用于大范围素数筛选。在实际应用中,可以根据需求选择合适的方法进行实现。无论是简单的试除法,还是复杂的分区筛法,每种方法都有其独特的应用场景和优势。在实际开发中,掌握这些方法将大大提高编程效率和代码质量。
相关问答FAQs:
1. 使用JS如何判断一个数是素数?
要判断一个数是否为素数,可以使用以下的JS代码:
function isPrimeNumber(num) {
if (num <= 1) {
return false;
}
for (let i = 2; i <= Math.sqrt(num); i++) {
if (num % i === 0) {
return false;
}
}
return true;
}
// 使用示例
console.log(isPrimeNumber(5)); // true
console.log(isPrimeNumber(9)); // false
2. 如何使用JS找出指定范围内的所有素数?
要找出指定范围内的所有素数,可以使用以下的JS代码:
function findPrimeNumbers(start, end) {
const primeNumbers = [];
for (let i = start; i <= end; i++) {
if (isPrimeNumber(i)) {
primeNumbers.push(i);
}
}
return primeNumbers;
}
// 使用示例
console.log(findPrimeNumbers(1, 10)); // [2, 3, 5, 7]
console.log(findPrimeNumbers(10, 20)); // [11, 13, 17, 19]
3. 如何使用JS找出给定数组中的所有素数?
要找出给定数组中的所有素数,可以使用以下的JS代码:
function findPrimeNumbersInArray(arr) {
const primeNumbers = [];
for (let i = 0; i < arr.length; i++) {
if (isPrimeNumber(arr[i])) {
primeNumbers.push(arr[i]);
}
}
return primeNumbers;
}
// 使用示例
console.log(findPrimeNumbersInArray([1, 2, 3, 4, 5])); // [2, 3, 5]
console.log(findPrimeNumbersInArray([10, 11, 12, 13, 14])); // [11, 13]
文章包含AI辅助创作,作者:Edit2,如若转载,请注明出处:https://docs.pingcode.com/baike/3803552