2016-05-26 4 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

forループにconsole.log(outputArr)を追加すると、ループごとに配列が出力されます。最後のループまで配列に何も追加していないことがわかりますので、これが問題です。 –

+0

あなたはそれをデバッグしようとしましたか?なぜ追加しませんか? '分割された'の定義の下に 'console.log(divided.length)'があります。 –

+0

毎回同じパラメータを使って、すべての 'i'に対して' rangeArr'を再計算したようです。私はそれが必要だとは思わない - それは 'for'ループの前に一度構築するほうがよいでしょう。 – ahwayakchih

答えて

1

あなたの問題は、ライン上にある:dividedの長さがi又はcurrentはに等しい場合のみ真であるnum - 2と等しくなるように発生した場合、現在の番号のみoutputArrに追加されることを意味

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

あなたの例では7です。トリックを行う必要があります

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

にそれを変更します。

+0

母、コーヒーが必要です..ありがとう! – 11223342124

関連する問題