andthatch
andthatch

Reputation: 11

Issue with prime number test javascript

I'm a beginner and trying to complete a prime number test but I'm running into an issue. Here is what I have:

var n = Number(prompt("Input the number you want to check for prime:"));
var i;


if (n < 2) {
    alert(n + " is not a prime number.");
}
for (var i = 2; i <= Math.sqrt(n); i++) {
    if (n % i === 0) {
        alert(n + " is not a prime number.");
        break;
    }

    else {
        alert(n + " is a prime number."); 
        break;
    }
}

It's running correctly except an alert won't pop up if I input 3 or 2 and any number with a 3 in it is coming back as a prime number even if it isn't. Other than that all of my tests have worked.

Upvotes: 0

Views: 178

Answers (3)

Brandon Anzaldi
Brandon Anzaldi

Reputation: 7270

Ahhh, your problem is the way you've structured the loop. You're breaking out regardless of if the check's completed.

var n = Number(prompt("Input the number you want to check for prime:"));
var i;
var isPrime = true;

if (n < 2) {
    isPrime = false;
} else if (n < 4 && n >= 2) {
    // isPrime is already true
} else if (n % 2 === 0) {
    isPrime = false; // no divisor of 2 can be prime
} else {
  var sqrtN = Math.sqrt(n);
  for (var i = 3; i <= sqrtN; i = i + 2) {
      if (n % i === 0) {
          // Only break out of the loop if a match is found
          isPrime = false;
          break;
      }
  }
}
if (isPrime) {
    alert(n + " is a prime number.");
} else {
    alert(n + " is not a prime number.");
}

Or, a perhaps more organized solution:

function isPrime (n) {
  n = parseInt(n);
  var i;
  if (Number.isNaN(n)) {
    return false;
  } else if (n < 2) {
    // 1 is not prime
    return false;
  } if (n < 4) {
    // 2 and 3 are prime, so why not skip checking them?
    return true;
  } else if (n % 2 === 0) {
    // No number divisible by 2 is prime.
    return false;
  } else {
    // This won't change, so calculate it once as suggested by Weather Vane.
    var sqrtN = Math.sqrt(n);
    // 4, 6, 8... All divisible by 2, and would be caught by initial check.
    for (i = 3; i < sqrtN; i = i + 2) { 
      // Not a prime if it's evenly divisible. 
      if (n % i === 0) {
        return false; 
      }
   }
   // Otherwise prime.
   return true; 
  }
}

Upvotes: 1

Oriol
Oriol

Reputation: 288590

Of course. If n % i is not 0, it means that i does not divide n, but it does not mean n is prime. You must check all i in order to say that.

Moreover, don't recalculate expensive Math.sqrt(n) at each iteration. And be aware of NaN.

var n = Number(prompt("Input the number you want to check for prime:"));
function isPrime(n) {
  if (n < 2 || !n) return false;
  for (var i = 2; i*i <= n; i++) {
    if (n % i === 0) return false;
  }
  return true;
}
alert(n + " is " + (isPrime(n) ? "" : "NOT ") + "a prime number.");

Of course, this algorithm is exponential (pseudo-polynomial). Don't use it for big n. Instead, see e.g. Miller–Rabin primality test or AKS primality test, which are polynomial.

Upvotes: 1

shrestha rohit
shrestha rohit

Reputation: 2940

var UI = window.prompt("Enter a whole number to test as a prime number: \n", "0");
var TV = parseInt(UI, 10);
var HITS = 0;
var DD = TV;
while (DD > 0) {
    if (TV % DD === 0) {
        HITS++;
    }
    DD--;
}

if (HITS > 2) {
    document.write(UI + " is a NOT prime number");
} else {
    document.write(UI + " is a prime number");
}

Please have reference to old questions asked in stackoverflow link to the old question

Upvotes: 0

Related Questions