素数简单测试

时间:2013-07-24 13:30:57

标签: javascript

以下代码似乎总是返回true,无论我插入的是什么值,我都看不出原因。如果n = 8,那么arr2应该包含i的值为2,4和8? 有人可以解释一下吗?非常感谢你。

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;
            };
    };

4 个答案:

答案 0 :(得分:2)

您原始代码中的一些问题:

  • 您只进行了一次迭代
  • 您声明数组在循环内部保留分区,使其始终具有最多1个项目。

快速解决上述问题:

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

优化的代码如果没有被重新使用,则不会遍历整个除数列表(猜测那是你想要实现的):

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

答案 1 :(得分:0)

两个问题: 不要在循环中声明数组,因为它将在每个循环中重置。 并将你的返回移到循环之外,因为你的函数将在第一次循环时返回,对于奇数(n%2 = 0,偶数),它总是为真。

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");   
});

答案 2 :(得分:0)

将前1001个位置返回到素数数组。 有用的代码修改,享受!

//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]);

答案 3 :(得分:-1)

你的病情

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

正在检查>1而不是>0>=1,这会忽略您指定的主要条件。因此,您更正的代码将是这样的:

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;}

有更好的方法来检查素数。这是我能抓住的最快的一个:

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;
}

来源:http://www.javascripter.net/faq/numberisprime.htm