2016-05-26 4 views
0

Ich arbeite an Primzahlen-Algorithmus, und ich fast fertig .. Ich denke, Ausgang Array aktualisiert wird jedes Mal Schleife beendet, also wenn ich Funktion mit Primzahl aufrufen: zB primes(7), bekomme ich [7] anstelle von [2,3,5,7]. Wenn es mit nicht-prim aufgerufen wird, ist Ausgabe arr leer.Nur letzter Wert an Array geschoben

Hier Code:

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

Wie kann ich dieses Problem beheben?

+0

Wenn Sie console.log (outputArr) zur for-Schleife hinzufügen, wird dies dazu führen, dass das Array bei jeder Schleife ausgegeben wird. Sie können feststellen, dass dem Array bis zur letzten Schleife nichts hinzugefügt wird. Dies ist also Ihr Problem. –

+0

hast du versucht, es zu debuggen? warum nicht z.B. 'console.log (dividiert.length)' unterhalb der Definition für 'geteilt', um zu sehen, was vor sich geht? –

+0

Sie scheinen "rangeArr" für jedes "i" neu zu berechnen, wobei jedes Mal dieselben Parameter verwendet werden. Ich denke nicht, dass das nötig ist - es wäre besser, es einmal zu bauen, vor der "for" -Schleife. – ahwayakchih

Antwort

1

Ihr Problem ist, auf der Linie:

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

, die die aktuelle Zahl bedeutet nur outputArr hinzugefügt wird, wenn die Länge des divided geschieht num - 2 zu entsprechen, die nur wahr ist, wenn i oder current zu gleich 7 in Ihrem Beispielfall.

Ändern Sie es an:

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

sollte es tun.

+0

Haha, ich brauche Kaffee .. Danke! – 11223342124