2017-02-04 8 views
0

これは愚かな投稿かもしれませんが、私のコードが正しく動作しない理由を理解できません。レコードのために、私はすでに動作する別のコードを書いたが、私はまだこれがなぜないのか分からない。Classic JS Prime Number

第2のifのステートメントは常にtrueと同じになりますか?コメントとして

https://jsfiddle.net/vhdh5x3d/2/

/* This code doesn't work... */ 
var testNumber = prompt("Please enter a number you'd like to test"); 

for (var i = 2; i < testNumber; i++) { 
    if (testNumber % i == 0) { 
    document.getElementById("test-results").innerHTML = "Your number, " + testNumber + ", is not a prime number."; 
    } 
    if ((testNumber - 1) == i && testNumber % i != 0) { 
    document.getElementById("test-results").innerHTML = "Congratulations! Your number, " + testNumber + ", is a prime number!"; 
    } 
} 
+0

数学 'X%X-1 'は常に非ゼロ' X> 2'です。テストすべき条件は何ですか? – JJJ

+0

あなたはそれぞれのforループで結果をオーバーライドしていますか? –

+0

ループの問題は簡単です。最初のif文は何度も真であると証明されるかもしれませんが、あなたは常に2番目のif文を打ちます。最終的に、条件は「i」が増えるにつれて満たされます。あなたは最初のifステートメントで休憩が必要です。素数を得るもっと良い方法があります。 – SpYk3HH

答えて

0

あなたのコードは、以下のことを想定しているようだ((testNumber - 1) == i) && ((testNumber % i) != 0)場合は正の整数testNumberと別の正の整数i与えられ、それはtestNumberが素数であることを意味しています。

この仮定は間違っています。例えば、testNumber = 8i = 7の場合を考えてみましょう。上記の条件は成り立ちますが、8は素数ではありません。

-1
var testNumber = prompt("Please enter a number you'd like to test"); 
for (var i = 2; i < testNumber; i++) { 
    if (testNumber % i == 0) {  
    break;//already found a working number, so stop 
    } 
} 
//if last iteration reached without breaking its a prime 
document.getElementById("test-results").innerHTML = "Your number, " + testNumber + ", is "+(testNumber==i?"a":"not a")+" prime number."; 

http://jsbin.com/qabivasiyu/edit?console

ループを壊す必要がある場合、既にはずのループのためにある場合、第二の指摘、及び第一。アイブ氏はまた、あなたのコードビット簡素化...

+0

なぜdownvote? –

0

第2のifは必ずしも真ではなく、forループの最後の繰り返しにすぎません。したがって、あなたのhtmlで見られるのは、主に発見されたメッセージです。

あなたはこのような何かをする必要があります

var testNumber = prompt("Please enter a number you'd like to test"); 
var prime = true; 
for (var i = 2; i < testNumber; i++) { 
    if (testNumber % i == 0) { 
     prime = false; 

    } 
} 

if (prime == true) 
    document.getElementById("test-results").innerHTML = "Congratulations! Your number, " + testNumber + ", is a prime number!"; 
else 
    document.getElementById("test-results").innerHTML = "Your number, " + testNumber + ", is not a prime number."; 

これは、数が素数であるかどうかを調べるの些細なアルゴリズムです。あなたは、この目的のために多くの異なるアルゴリズムを見つけることができます。

0

あなたのコードにいくつかの問題を取り上げます。

  1. .innerHTMLを絶対に使用しないでください。この方法を使用する際に大きなセキュリティリスクがあります。ユーザーから直接コードを評価するものは絶対に挿入しないでください。 .eval()も同じです。代わりに.textContentを設定することを検討してください。

  2. 考えてみましょう...

    const testNumber = prompt("Please enter a number you'd like to test"); 
    if (testNumber === 1) { 
        document.getElementById("test-results").textContent = 'Sorry, this is not a prime number.' 
    } else if (testNumber === 2) { 
        document.getElementById("test-results").textContent = 'Congratulations, you entered a prime number.' 
    } else { 
    for (var x = 2; x < testNumber; x++) { 
        if (testNumber % x === 0) { 
        document.getElementById("test-results").textContent = 'Sorry, this is not a prime number.' 
        } 
    } 
        document.getElementById("test-results").textContent = 'Congratulations, you entered a prime number.' 
    } 
    
0

セカンドIfステートメントは常に真ではありません。最後の反復の間だけ2番目のif文に入り、htmlを設定します。 あなたのコードで実行していない条件が満たされた時点で、常に値を返す必要があります。コードの下

は動作します:

var testNumber = prompt("Please enter a number you'd like to test"); 

for (var i = 2; i < testNumber; i++) { 
    if (testNumber % i == 0) { 
    document.getElementById("test-results").innerHTML = "Your number, " + testNumber + ", is not a prime number."; 
return; 
    } 
    if ((testNumber - 1) == i && testNumber % i != 0) { 
    document.getElementById("test-results").innerHTML = "Congratulations! Your number, " + testNumber + ", is a prime number!"; 
return; 
    } 
} 
関連する問題