[Algorithm] Finding Prime numbers - Sieve of Eratosthenes

Given a number N, the output should be the all the prime numbers which is less than N.

The solution is called Sieve of Eratosthenes: 

First of all, we assume all the number from 2 to N are prime number (0 & 1 is not Prime number).

According to the Primse number defination that Prime number can only be divided by 1 & itself. So what we do is start from

2 * 2 = 4

2 * 3 = 6

2 * 4 = 8

2 * 5 = 10

...

2 * j <= N

3 * 2 = 6

3 * 3 = 9

...

i * j <= N

i is from 2 to N.

We are going to mark all the caluclated number to be Not prime numbers. In the end, the remining numbers should be Primes.

function findPrime (n) {
  let primes = [];
  
  for (let i = 0; i <= n; i++) {
    primes.push(1);
  }
  
  primes[0] = 0;
  primes[1] = 0;
  
  for (let i = 2; i <= Math.sqrt(n); i++) {
    if (primes[i] === 1) {
        for (let j = 2; i * j <= n; j++) {
          primes[i * j] = 0;
        }    
    }
  }
  
  return primes.map((val, index) => val === 1 ? index: 0).filter(Boolean);
} 

findPrime(14) // [ 2, 3, 5, 7, 11, 13 ]

 

One optimization, we don't need to loop i from 2 to N, it is enough from 2 to Math.sqrt(n)

posted @ 2019-05-14 23:09  Zhentiw  阅读(348)  评论(0)    收藏  举报