2016-06-21 17 views
0

Ich bin ein Anfänger und versuche, eine Primzahl-Test zu absolvieren, aber ich renne in ein Problem. Hier ist, was ich habe:Problem mit Primzahl Test Javascript

var n = Number(prompt("Input the number you want to check for prime:")); 
var i; 


if (n < 2) { 
    alert(n + " is not a prime number."); 
} 
for (var i = 2; i <= Math.sqrt(n); i++) { 
    if (n % i === 0) { 
     alert(n + " is not a prime number."); 
     break; 
    } 

    else { 
     alert(n + " is a prime number."); 
     break; 
    } 
} 

Es ist richtig, außer einer Warnung ausgeführt wird nicht Pop-up, wenn ich Eingang 3 oder 2 und eine beliebige Anzahl mit einem 3 in es kommt wieder als Primzahl auch wenn es isn t. Ansonsten haben alle meine Tests funktioniert.

+0

2 und 3 sind beide Prime, und das Problem ist die Art, wie Sie Ihre Schleife strukturiert haben. Es bricht beim ersten Mal aus der Schleife aus, da du auch innerhalb des Elbs brichst. Was stattdessen passieren sollte, ist, dass die abschließende Aussage außerhalb der Schleife liegen sollte. Sie müssen die Prüfung auch vollständig abbrechen, daher empfehle ich entweder a) das Umbrechen als Funktion, so dass Sie 'zurückkommen 'können, oder b) ein Flag setzen, anstatt sofort zu alarmieren, also' isPrime = true; break; ', dann überprüfe später, ob' isPrime === true' ist. –

+0

Das liegt daran, dass Sie nicht alle Teiler getestet haben, wenn Sie ankündigen, dass "n" prim ist. –

Antwort

1

Ahhh, Ihr Problem ist die Art und Weise Sie die Schleife strukturiert haben. Sie brechen aus, unabhängig davon, ob der Check abgeschlossen ist.

var n = Number(prompt("Input the number you want to check for prime:")); 
var i; 
var isPrime = true; 

if (n < 2) { 
    isPrime = false; 
} else if (n < 4 && n >= 2) { 
    // isPrime is already true 
} else if (n % 2 === 0) { 
    isPrime = false; // no divisor of 2 can be prime 
} else { 
    var sqrtN = Math.sqrt(n); 
    for (var i = 3; i <= sqrtN; i = i + 2) { 
     if (n % i === 0) { 
      // Only break out of the loop if a match is found 
      isPrime = false; 
      break; 
     } 
    } 
} 
if (isPrime) { 
    alert(n + " is a prime number."); 
} else { 
    alert(n + " is not a prime number."); 
} 

Oder eine vielleicht besser organisiert Lösung:

function isPrime (n) { 
    n = parseInt(n); 
    var i; 
    if (Number.isNaN(n)) { 
    return false; 
    } else if (n < 2) { 
    // 1 is not prime 
    return false; 
    } if (n < 4) { 
    // 2 and 3 are prime, so why not skip checking them? 
    return true; 
    } else if (n % 2 === 0) { 
    // No number divisible by 2 is prime. 
    return false; 
    } else { 
    // This won't change, so calculate it once as suggested by Weather Vane. 
    var sqrtN = Math.sqrt(n); 
    // 4, 6, 8... All divisible by 2, and would be caught by initial check. 
    for (i = 3; i < sqrtN; i = i + 2) { 
     // Not a prime if it's evenly divisible. 
     if (n % i === 0) { 
     return false; 
     } 
    } 
    // Otherwise prime. 
    return true; 
    } 
} 
+1

Noch besser wäre a) Berechnen Sie die Quadratwurzel nur einmal, b) überprüfen Sie für "2" spezifisch, c) überspringen Sie sogar Teiler mit 'für (var i = 3; i <= rootn; i + = 2)' –

0
var UI = window.prompt("Enter a whole number to test as a prime number: \n", "0"); 
var TV = parseInt(UI, 10); 
var HITS = 0; 
var DD = TV; 
while (DD > 0) { 
    if (TV % DD === 0) { 
     HITS++; 
    } 
    DD--; 
} 

if (HITS > 2) { 
    document.write(UI + " is a NOT prime number"); 
} else { 
    document.write(UI + " is a prime number"); 
} 

Bitte Bezug auf alte Fragen in Stackoverflow gefragt haben link to the old question

+1

Wenn Sie nach Primzahlen suchen, müssen Sie nur bis zur Quadratwurzel der Zahl überprüfen, nur ein Tipp – MayorMonty

1

Natürlich. Wenn n % i nicht 0 ist, bedeutet dies, dass i nicht n teilt, aber es bedeutet nicht n ist Prime. Sie müssen alle i überprüfen, um das zu sagen.

Darüber hinaus keine teure Math.sqrt(n) bei jeder Iteration neu berechnen. Und beachten Sie NaN.

var n = Number(prompt("Input the number you want to check for prime:")); 
 
function isPrime(n) { 
 
    if (n < 2 || !n) return false; 
 
    for (var i = 2; i*i <= n; i++) { 
 
    if (n % i === 0) return false; 
 
    } 
 
    return true; 
 
} 
 
alert(n + " is " + (isPrime(n) ? "" : "NOT ") + "a prime number.");

Natürlich ist dieser Algorithmus exponentiell (pseudo-polynomial). Verwenden Sie es nicht für große n. Siehe stattdessen z.B. Miller–Rabin primality test oder AKS primality test, die Polynom sind.