2016-07-28 9 views
2

私は長い間チャレンジしてきましたが、複数のソリューションやアドバイスをオンラインで読んでいても正しく適用できないようです。Javascriptの素数チェック

命令は、「1つの整数引数をとり、整数が小数点以下であるかどうかに応じて真または偽を返す関数isPrimeを定義する」です。

、私は多くのことを試してみたが、これは私がもらうことができました遠い:

function isPrime(num) { 
    if (num <= 1) return false; 
    if (num === 2) return true; 

    for (var i = 2; i < num; i++) 
    if (num % i === 0) return false; 
    else return true; 
} 

をしかし、私は聞いています:「9は素数ではありません。」

ご協力いただきありがとうございます!

+0

ステップ。 'num'は' 1'よりも小さくなく、 '2'と同じでもないので、ループします。それで '9%2'を' 1'と評価して 'else'を打ちました。' true true;は9をプライムとしています。明らかにそうではありません。 –

答えて

3

forループの完了後にelse caseを実行せずに戻ります。 forループカウントは、i <= Math.sqrt(num)@PatrickRobertsとして提案されているように)に条件を更新することによって減らすことができます。 FYI

function isPrime(num) { 
    if (num <= 1) return false; 
    if (num === 2) return true; 

    // storing the calculated value would be much 
    // better than calculating in each iteration 
    var sqrt = Math.sqrt(num); 

    for (var i = 2; i <= sqrt; i++) 
    if (num % i === 0) return false; 
    return true; 
} 

ループ num % i === 09 % 2)の最初の繰り返しで、あなたのコードでは、 falseになり、それがelse文( true)を返します。

+2

ここでは、[Eratosthenesのふるい](https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes)について話しましょう。それは直面しているので、これはひどく非効率的な実装です –

+1

ありがとう、これは素晴らしいです! –

+1

私は一回以上upvoteできる非常に良い答え。 –

4

問題は、forループのelse return true;にあります。 iあなたは9 % iあなたがelseブロックとreturn trueを実行し、0ではなかったことを確認した直後に、2である最初の反復、で

すべての反復がreturn falseに失敗する前に、return trueにする必要はありません。

+0

返品の真実を説明してくれてありがとう、私はついに理解する! –

-1

ループのためにあなたにキーワードを続ける(またはelse文を省略)が、あなたはリターンキーワードを持っている場合は、他の両方のためにがあるはずです。だから、あなたのI = 2

function isPrime(num) { 
    if (num <= 1) return false; 
    if (num === 2) return true; 

    for (var i = 2; i < num; i++) 
    if (num % i === 0) return false; 
    else continue; // omittable 

    return true; 
} 

ためのループだけを反復処理するためにあなたは、この コードの機能/性能を向上させるために、物事の多くを行うことができます。たとえば、i < num forループの条件は、非常に広い範囲を許容します です。 numの平方根は、より高い境界に十分です。あなたのコードを通して

+2

ここでは 'else continue'は無用です。 –

+0

はい、今私は違いを見せるように書いています。 –

0
function primeNo(){ 
//"number1" is "ID" of HTML input block. 
var num2 = document.getElementById("number1").value; 
var dev = num2/2; 
var i; 
for(i=2; i < dev ; i++){ 
    if(num2%i == 0){ 
     //"ans1" is "ID of <p> where ans needs to display" 
     document.getElementById("ans1").innerHTML = "Not a Prime No"; 
     break; 
    } 
    else{ 
     document.getElementById("ans1").innerHTML = "Prime No"; 
    } 
} 

}

+0

"1"は素数リストに含まれないので、ループは2で始まります。数字がその数値の半分まで完全に割り切れる場合は、素数ではありません。リマインダーが "0"の場合、 "Break"を使用してエスケープします。 –

関連する問題