前端算法:统计素数个数(埃氏筛选法)

题目

代码:

function eratosthenes(n){
    var count=0
    var isPrime=new Array(n)
    isPrime.fill(false)
    for(var i=2;i<n;i++){
        if(!isPrime[i]){
            count++
            for(var j=i*i;j<n;j+=i){
                isPrime[j]=true
            }
        }
    }
    console.log(count)
}

eratosthenes(100)

 解决思路:首先将所有数组的所有值赋值为false,当遇到一个false时,即代表他是素数,count++,因为在 

会把后面不是素数的值选出来,赋值为true,则只有素数是false

举个例子

当前时isPrime[3],即判断的是3是不是素数,3是素数,count++;

接着进入下一层循环,假设我们将for(var j=i*i;...)改为for(var j=i+i;...),则j的值是j=2x3,j=3x3,j=3x4...,则j都是合数,不可能是复数,因此赋值将isPrime[j]=true,在之后的判断就不用遍历这些值。

但是for(var j=i+i;...)会出现什么情况呢

2会经历2x2,2x3,2x4...,而4则会2x4,3x4,4x4,但是4的前两种情况都会被2和3所有经历过,因此会出现重复赋值的情况。

因此改为for(var j=i*i;...),则4会从4x4开始,不会出现被覆盖的情况,算法优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值