1

I am trying to generate prime numbers like this:

generatePrimeNumbersBelowN = (n) ->
  for i in [2..n-1]
    isPrime = true
    for j in [2..i-1]
      isPrime = false if i % j == 0
      break if not isPrime
    console.log(i, "is Prime Number.") if isPrime

generatePrimeNumbersBelowN(100);

I am getting prime numbers from 3 to 97, inclusive. I am new to JavaScript/CoffeeScript, so please tell me what's happening to 2?

Here's the generated JS code:

var generatePrimeNumbersBelowN;

generatePrimeNumbersBelowN = function(n) {
  var i, isPrime, j, k, l, ref, ref1, results;
  results = [];
  for (i = k = 2, ref = n - 1; 2 <= ref ? k <= ref : k >= ref; i = 2 <= ref ? ++k : --k) {
    isPrime = true;
    for (j = l = 2, ref1 = i - 1; 2 <= ref1 ? l <= ref1 : l >= ref1; j = 2 <= ref1 ? ++l : --l) {
      if (i % j === 0) {
        isPrime = false;
      }
      if (!isPrime) {
        break;
      }
    }
    if (isPrime) {
      results.push(console.log(i, "is Prime Number."));
    } else {
      results.push(void 0);
    }
  }
  return results;
};

generatePrimeNumbersBelowN(100);

1 Answers1

0
generatePrimeNumbersBelowN = (n) ->
  for i in [2..n-1]
    isPrime = true
    for j in [2..i-1]
      isPrime = false if i % j == 0
      break if not isPrime
    console.log(i, "is Prime Number.") if isPrime

When i is 2, j ranges from 2 down to 1. You then check i % j which is 2 % 1 which is zero and claim that 2 is not a prime.

Because for x in [b..a] delivers a downward loop from b to a, while loop construct solves this problem.

generatePrimeNumbersBelowN = (n) ->
  i = 2
  while i < n
    isPrime = true
    j = 2
    while j < i
      isPrime = false if i % j == 0
      break if not isPrime
      j++
    console.log(i, "is Prime Number.") if isPrime
    i++

generatePrimeNumbersBelowN(100);
Cliff Stanford
  • 614
  • 7
  • 11