2013-07-24 70 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]);