📅  最后修改于: 2023-12-03 15:11:18.167000             🧑  作者: Mango
本文将介绍一个用于计算指定范围内素数的 Javascript 程序。该程序使用了两种不同的算法(暴力法和筛法)来计算素数,用户可以根据自己的需求选择使用相应算法。
该程序可以计算指定范围内的素数。用户可以输入需要计算的素数的范围,程序将返回一个包含所有素数的数组。
暴力法是计算素数的一种简单但低效的方法。该方法从2开始遍历所有可能的数,对每个数进行判断是否为素数,如果是素数则将其加入结果数组中。
function findPrimesByBruteForce(start, end) {
const primes = [];
// 遍历范围内的所有数
for (let i = start; i <= end; i++) {
let isPrime = true;
// 判断是否为素数
for (let j = 2; j <= Math.sqrt(i); j++) {
if (i % j === 0) {
isPrime = false;
break;
}
}
// 将素数添加到结果数组中
if (isPrime && i > 1) {
primes.push(i);
}
}
return primes;
}
筛法是计算素数的一种高效的方法。该方法使用一个数组来记录每个数是否为素数,然后通过遍历数组将素数的倍数标记为非素数。
function findPrimesBySieve(start, end) {
const isPrime = new Array(end + 1).fill(true);
const primes = [];
// 将0和1标记为非素数
isPrime[0] = false;
isPrime[1] = false;
// 遍历数组
for (let i = 2; i <= end; i++) {
if (isPrime[i]) {
// 将素数添加到结果数组中
if (i >= start) {
primes.push(i);
}
// 将素数的倍数标记为非素数
for (let j = 2 * i; j <= end; j += i) {
isPrime[j] = false;
}
}
}
return primes;
}
以下是一个示例程序,它要求用户输入一个数字范围并选择算法来计算素数。
const readline = require('readline-sync');
console.log('请输入需要计算素数的范围:');
const start = parseInt(readline.question('开始的数字:'));
const end = parseInt(readline.question('结束的数字:'));
console.log('请选择计算素数的算法:');
const algorithms = [
{ name: '暴力法', func: findPrimesByBruteForce },
{ name: '筛法', func: findPrimesBySieve }
];
for (let i = 0; i < algorithms.length; i++) {
console.log(`${i + 1}. ${algorithms[i].name}`);
}
const choice = parseInt(readline.question('请选择:')) - 1;
if (choice < 0 || choice >= algorithms.length) {
console.log('选择无效');
} else {
const primes = algorithms[choice].func(start, end);
console.log(`[${start}, ${end}]范围内的素数为:\n${primes.join(', ')}\n共有${primes.length}个素数`);
}
该程序提供了两种不同的算法来计算素数。虽然暴力法在算法效率上不如筛法,但对于小范围内的素数计算,暴力法也是一种可行的方法。对于大范围的素数计算,筛法是更好的选择。