Reno
Reno

Reputation: 1139

Prime Number Simple Test

the following code always seems to return true whatever value of n I plug in and I can't see why. If n = 8, then arr2 should contain the value of i for 2, 4 and 8? Can someone please explain? Thank you very much.

var primetest = function(n){
    var divisor  = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
    for (var i = 0; i < divisor.length; i++) {
            var arr2 = [];
            if(n%divisor[i] == 0) {arr2.push(i);}
                    if(arr2.length > 1) {prime = false;}
                    else {prime = true;}
                    return prime;
            };
    };

Upvotes: 0

Views: 223

Answers (4)

user2963757
user2963757

Reputation: 107

Return the first 1001 positions into an array of prime numbers. Usefull code to modify, enjoy!

//cum calculam daca un numar este prim
//chiar mai mult - care este al 1001-lea nr prim
function isPrime(num) {
if(num < 2) return false;
for (var i = 2; i < num; i++) {
    if(num%i===0)
        return false;
}
return true;
}
var shir=[];
var j=0;
var i=1;
while(j<1001)
{
if(isPrime(i)) 
{shir[j]=i;
j++;i++}
else{i++}
}
console.log(shir);
console.log (shir[0]);
console.log (shir[1000]);
alert("Al 1001-lea numar prim este " + shir[1000]);

Upvotes: 0

speti43
speti43

Reputation: 3046

Two problems: Don't declare you array inside the loop, because it will reset in every loop. And move your return outside of the loop because your function will return at first loop, wich always true for odd numbers(n%2 = 0 for even numbers).

JSFiddle

function primetest(n){
var divisor  = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
var arr2 = []; 
for (var i = 0; i < divisor.length; i++) {

      if((n%divisor[i]) === 0) 
          arr2.push(i);
      if(arr2.length > 1)
          prime = false;   
      else prime = true;                   
  };
  return prime;     
}

$(function (){
  var pprime = 7;

  if(primetest(pprime))   
  alert("ok");   
});

Upvotes: 0

Shadow Wizard
Shadow Wizard

Reputation: 66389

Couple of problems in your original code:

  • You are doing only one iteration
  • You declare the array holding divisions inside the loop, causing it to always have maximum 1 item.

Quick fix of the above would be:

var primetest = function(n){
    var divisor  = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
    var arr2 = [];
    for (var i = 0; i < divisor.length; i++) {
        if(n%divisor[i] == 0) {
            arr2.push(i);
        }
    }
    return arr2.length <=1;
}

Live test case.

Optimized code that does not iterate through the whole list of divisors if not reuired (guess that's what you were trying to achieve) is:

var primetest = function(n){
    var divisor  = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
    var arr2 = [];    
    for (var i = 0; i < divisor.length; i++) {
        if(n % divisor[i] === 0) {
            arr2.push(i);
            if (arr2.length > 1)
                return false;
        }
    }
    return true;
};

Updated fiddle.

Upvotes: 2

Ashok Goli
Ashok Goli

Reputation: 5183

Your condition

if(arr2.length > 1) {prime = false;}

is checking for >1 instead of >0 or >=1 which is ignoring the prime condition that you specified. Hence your corrected code would be something like this:

var primetest = function(n){
    var divisor  = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
    for (var i = 0; i < divisor.length; i++) {
            var arr2 = [];
            if(n%divisor[i] == 0) {arr2.push(i);}
                    if(arr2.length > 0) {prime = false;}
                    else {prime = true;}
                    return prime;
            };
    };
if(arr2.length > 1) {prime = false;}

There are better ways to check for prime number. Here's the fastest one I could lay my hands on:

var primetest = function(n) {
 if (isNaN(n) || !isFinite(n) || n%1 || n<2) return false; 
 if (n==leastFactor(n)) return true;
 return false;
}

// leastFactor(n)
// returns the smallest prime that divides n
//     NaN if n is NaN or Infinity
//      0  if n=0
//      1  if n=1, n=-1, or n is not an integer

leastFactor = function(n){
 if (isNaN(n) || !isFinite(n)) return NaN;  
 if (n==0) return 0;  
 if (n%1 || n*n<2) return 1;
 if (n%2==0) return 2;  
 if (n%3==0) return 3;  
 if (n%5==0) return 5;  
 var m = Math.sqrt(n);
 for (var i=7;i<=m;i+=30) {
  if (n%i==0)      return i;
  if (n%(i+4)==0)  return i+4;
  if (n%(i+6)==0)  return i+6;
  if (n%(i+10)==0) return i+10;
  if (n%(i+12)==0) return i+12;
  if (n%(i+16)==0) return i+16;
  if (n%(i+22)==0) return i+22;
  if (n%(i+24)==0) return i+24;
 }
 return n;
}

Source: http://www.javascripter.net/faq/numberisprime.htm

Upvotes: -1

Related Questions