0

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

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

4 回答 4

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

现场测试用例

如果不要求,则不会遍历整个除数列表的优化代码(猜想这就是您想要实现的目标)是:

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

更新了小提琴

于 2013-07-24T13:33:35.843 回答
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");   
});
于 2013-07-24T13:53:59.767 回答
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]);
于 2013-11-10T20:00:37.970 回答
-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

于 2013-07-24T13:39:18.340 回答