2016-05-26 26 views
0

我正在處理素數算法,並且我幾乎完成了它。我認爲每次循環結束時都會更新輸出數組,因此如果我用素數調用函數:例如primes(7),我會得到[7]而不是[2,3,5,7]。如果使用非素數調用,則輸出arr爲空。只有最後一個值推到數組

這裏是代碼:

function rimes(num){ 
    var outputArr = []; 

    for(var i=1; i<=num; i++){ 
     function range(start, count) { 
      return Array.apply(0, Array(count)) 
        .map(function (element, index) { 
          return index + start; 
         }); 
     } 
     var rangeArr = range(1,num); 
     var current = i; 

     function rangeFiltering(value){ 
      return value !== 1 && value < current; 
     } 
     var filteredRange = rangeArr.filter(rangeFiltering); 

     function dividingByEachRangeElement(rangeElement){ 
      return current % rangeElement !== 0; 
     } 
     var divided = filteredRange.filter(dividingByEachRangeElement); 

     if(divided.length === num - 2){ //current is prime if there are all numbers from 1 to current in divided array.(if there are zeros after modulo) i.e. when current is 5(prime), divided array is [2,3,4]. When current is 6(non prime), divided arr is [4,5] - 2,3 are missing because 6%2 = 0 and 6%3 = 0. 
      outputArr.push(current); 
     } 
    } 
    console.log(outputArr); 
} 
sumPrimes(47); 


//sumPrimes(6) -> []; 
//sumPrimes(7) -> [7]; 
//sumPrimes(11) -> [11]; 

我怎麼能解決這個問題?

+0

如果將console.log(outputArr)添加到for循環中,則會導致它在每個循環中輸出數組。你可以告訴它,直到最後一個循環它纔會向數組添加任何東西,所以這是你的問題。 –

+0

你嘗試過調試嗎?爲什麼不添加例如console.log(divided.length)'低於'divided'的定義,看看發生了什麼? –

+0

您似乎每次使用相同的參數重新計算每個「i」的'rangeArr'。我不認爲這是必要的 - 在'for'循環之前構建一次會更好。 – ahwayakchih

回答

1

您的問題是就行:

if(divided.length === num - 2)

這意味着當前數目僅添加到outputArr如果divided長度正好等於num - 2這是唯一真正當icurrent等於您的示例中爲7

將其更改爲:

if(divided.length === current - 2)

應該做的伎倆。

+0

哈哈,我需要咖啡..謝謝! – 11223342124

相關問題