题目
代码:
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开始,不会出现被覆盖的情况,算法优化