2013-07-24 71 views
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; 
      }; 
    }; 
+7

您的返回语句位于循环中,因此整个函数在第一次迭代达到该语句时结束。 – CBroe

+1

将for循环后的If(arr2.length> 1)检查放在 – dz15

+2

之后...并且在每次循环迭代时重置arr2变量 - 将该var语句移到循环之外。 –

回答

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

不通过分频器的整个列表迭代如果不是reuired(猜这就是你试图实现)优化的代码是:

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

+2

你还应该提到你将arr2的初始化移到了循环外部,以防止它在每次迭代时被清除。 – xdumaine

+0

@roviuser我做了:“并声明数组在循环之外也保留着分区”:) –

+0

这个解决方案将遍历整个除数组(19次),无论在结束之前该数字是否为总数的阵列。例如,假设n是4.在数组中3个循环后,您会知道n不是素数。只要arr2.length大于1,您可以返回false。 – Fotiman

-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

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