首页 > 其他分享 >js找出一定范围内的全部素数(埃拉托斯特尼筛法Sieve of Eratosthenes)

js找出一定范围内的全部素数(埃拉托斯特尼筛法Sieve of Eratosthenes)

时间:2023-08-29 13:57:04浏览次数:33  
标签:斯特尼 标记 js 素数 isPrime Sieve true

最近在看js的基础,看到函数这一章的时候,看到了这种写法。

 原文链接:https://zh.javascript.info/function-basics

突然懵了个B,js还能这么写。然后问了下chat,才想起来这是js的标签用法。

在JavaScript中,标签(label)是一种标识符,用于标记代码中的特定位置,通常是在循环语句中使用。标签的主要作用是在嵌套的循环中,让`break`和`continue`等控制流语句能够跳出或者跳过指定的循环,而不是默认地只操作当前内层循环。

语法是一个普通的标识符后面跟一个冒号,例如:`labelName`。

outerLoop: for (let i = 0; i < 3; i++) {
  for (let j = 0; j < 3; j++) {
    if (i === 1 && j === 1) {
      break outerLoop; // 跳出外层循环
    }
    console.log(i, j);
  }
}

当i和j都为1的时候就直接跳出了外层循环。结果就是输出:

 其实这个标签在实际编程中用的并不多,因为会使代码变得难以理解,而且不好维护。

讲了这么多,还没说到本文的重点,那就是埃拉托斯特尼筛法。之所以知道这个方法,是因为我贴第一段代码问chat的时候,chat给我推荐了这个算法。

 然后我就google了这个算法。刚开始看代码是不懂这个算法的,直到看到维基百科的这张gif,瞬间就明白了。https://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Sieve_of_Eratosthenes_animation.gif/350px-Sieve_of_Eratosthenes_animation.gif

它的基本思路是从最小的素数开始,将其倍数标记为非素数,然后继续处理下一个未被标记的数,直到处理完所有小于给定范围的数。

基本步骤如下:

1、首先创建一个长度为`n + 1`的布尔数组`isPrime`,初始时就所有元素设置为`true`,表示所有的数字都是素数。

2、从2开始,遍历到`sqrt(n)`,对于每个数`i`,如果`isPrime[i]`为`true`,则执行下面的步骤:

  a.将`i`标记为素数(因为`i`自身是素数)。

  b.将大于等于`i`的`i`的倍数标记为非素数。从`i * i`开始,每次增加`i`,直到达到或超过`n`。

3、遍历数组`isPrime`,所有仍然标记为`true`的索引位置即为素数。

这个方法的优势在于它避免了重复检查,一旦某个数标记为非素数,它所有倍数也会标记,从而减少了不必要的计算。

第2部之所以遍历到`sqrt(n)`,是因为一个合数(非素数)x可以表示为两个数的乘积,它必定有一个小于等于sqrt(x)的因子,因为如果两个因子都大于sqrt(x),那么乘积必定大于x。

具体的代码如下:

function findPrime(n) {
            const isPrime = new Array(n + 1).fill(true);
            isPrime[0] = isPrime[1] = false;

            for (let i = 2; i <= Math.sqrt(n); i++) {
                if (isPrime[i]) {
                for (let j = i * i; j <= n; j += i) {
                    isPrime[j] = false;
                }
                }
            }

            const primes = [];
            for (let i = 2; i <= n; i++) {
                if (isPrime[i]) {
                primes.push(i);
                }
            }

            return primes;
        }

 

标签:斯特尼,标记,js,素数,isPrime,Sieve,true
From: https://www.cnblogs.com/junlinglife/p/17663982.html

相关文章

  • Gson与FastJson详解
    Gson与FastJson详解Java与JSON做什么?将Java中的对象快速的转换为JSON格式的字符串.将JSON格式的字符串,转换为Java的对象.Gson将对象转换为JSON字符串转换JSON字符串的步骤:引入JAR包在需要转换JSON字符串的位置编写如下代码即可:Stringjson=newGson().toJSON(......
  • 017-管理后台通用js提取
    //定义全局常量,可供全局使用varzhuhuo={config:{},//bootstrap-table属性配置信息options:{},/***参数初始化*/set:function(id){ //判断配置信息里面是否有值,且当前的事件监听不为空if($.tools.getLength(zhuhu......
  • nodejs的安装及使用
    安装打开Node.js的官网并下载适用于你操作系统的安装包。Node.js提供了Windows、Mac和Linux的安装包。下载完成后,双击安装包运行安装向导。按照提示一步步进行安装。在安装过程中可以选择自定义安装路径,也可以使用默认路径【强烈建议安装在C盘】安装完成后,打开命令提示符(Windo......
  • Java 15 JSTL实现登录退出
     jstl.jsp<%@pagecontentType="text/html;charset=UTF-8"language="java"%><%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%><%--if--%><%@taglibprefix="fmt"uri=&......
  • 用js reduce 写一个reduce循环遍历数组对象,里面带有if判断
    简单的reduce案例,实际场景中使用不多,这里给到一个常用的遍历数组对象!!varproducts=[{name:"Apple",price:2.5,quantity:3},{name:"Banana",price:1.5,quantity:2},{name:"Orange",price:3,quantity:4},];vartotalPrice=products......
  • JS 原型和原型链
    原型和原型链-题目前言JS是基于原型prototype继承的语言ES6可使用类class继承(语法糖,本质还是原型继承)题目如何准确判断一个变量是数组类型实现一个简易的jQuery,考虑插件和扩展性——PS:虽然jQuery已应用不多,但借助学习原型非常好class是语法糖,其本质是......
  • js 水印
    initWatermark(){//创建一个canvasconstcanvas=document.createElement('canvas');//设置画布的宽高canvas.width=200;canvas.height=200;//获取画笔constctx=canvas.getContext('......
  • 大华智慧园区综合管理平台searchJson SQL注⼊漏洞
    漏洞简介大华智慧园区综合管理平台是一款综合管理平台,具备园区运营、资源调配和智能服务等功能。平台意在协助优化园区资源分配,满足多元化的管理需求,同时通过提供智能服务,增强使用体验。由于该平台未对用户输入数据做限制,攻击者可以直接将恶意代码拼接进SQL查询语句中,导致系统出......
  • Unity UnityWebRequest.Post传参Json数据
    UnityWebRequest.PostUnity中的HTTP通信主要依赖的是Unity自带的UnityWebRequest类,之前的WWW类已被弃用Post请求,向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。对应的调用方法:UnityWebR......
  • 开发了一个json格式化工具,使用js格式化json的代码分享
    今天给大家介绍一下如何通过js来格式化json。假设json字符串是:{"name":"刘德华","age":25.2,"birthday":"1990-01-01"}我们使用的是Js的JSON方法先把json字符串转为json对象,方法如下:varjsonString='{"name":"刘德华","age":35.2......