📌  相关文章
📜  用于计算范围内素数的 Javascript 程序(1)

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

用于计算范围内素数的 Javascript 程序

本文将介绍一个用于计算指定范围内素数的 Javascript 程序。该程序使用了两种不同的算法(暴力法和筛法)来计算素数,用户可以根据自己的需求选择使用相应算法。

一. 程序简介

该程序可以计算指定范围内的素数。用户可以输入需要计算的素数的范围,程序将返回一个包含所有素数的数组。

二. 程序实现
1. 暴力法实现

暴力法是计算素数的一种简单但低效的方法。该方法从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;
}
2. 筛法实现

筛法是计算素数的一种高效的方法。该方法使用一个数组来记录每个数是否为素数,然后通过遍历数组将素数的倍数标记为非素数。

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}个素数`);
}
四. 总结

该程序提供了两种不同的算法来计算素数。虽然暴力法在算法效率上不如筛法,但对于小范围内的素数计算,暴力法也是一种可行的方法。对于大范围的素数计算,筛法是更好的选择。