2

これは別のSOの質問に似ていることは知っていますが、変数primeは 以外の任意の数値であると想定されて1おり、ブール値 が割り当てられるように見えますnum != 1。このコード行が実際に何をしているのか誰か教えてもらえますか?

これが使用されているコードです

function isPrime( num ) { 
  var prime = num != 1; // Everything but 1 can be prime 
  for ( var i = 2; i < num; i++ ) { 
    if ( num % i == 0 ) { 
      prime = false; 
      break; 
    } 
  } 
  return prime; 
} 

編集: この行は次のようにすると思います:

if( num != 1) {
    prime = num;
}

しかし、このコード行がこれを行う理由または方法を知りたいと思っています。

4

4 に答える 4

2

言い換えると:

num == 1 の場合、primeを false に設定し、ループをスキップします。

それ以外の場合は、ループに入り、標準ロジックを使用してprimeの値を決定します。

これは、(ループ内の) 標準ロジックが数値 1 で機能しないために行われます。

したがって、pst が言うように、ループ外のエッジ ケースをチェックします。

これにより、ループ内のロジックをクリーンに保つことができます。


読みやすくする (そしてすべての値を正しくする) ために、次のように書き直します。

function isPrime( num ) { 

    if (num <= 1) {
        return false;
    }

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

    return true; 
}

i がより大きくなったらループを終了してnum / 2、より効率的にすることもできます。

于 2012-12-14T21:28:36.160 に答える
2

あなたが正しく考えていたように、ステートメントvar prime = num != 1;はブール式の結果を(num != 1)変数に代入しますprime1この特殊なケースは、それ自体が素数ではないため、すべての素数チェック コードの種類に含まれています。

入力値の平方根までの除数のみをチェックした場合、アルゴリズムはさらに高速になる可能性があります。これについてはこちらで読むことができ、 if をチェックするnum > i*i方がはるかに効率的であることに気付くかもしれませんsqrt(num) > i

さらに、負の値またはゼロの値を入力すると、アルゴリズムが間違った値を返す可能性があります。

于 2012-12-14T21:32:01.970 に答える
1

1は素数ではありません

これはエッジケースチェックです。これは、for(i = 2;..)(以下で)「スキップ」1:ループが実行されないため、に一度primeだけ設定されるためfalseです(これは、の評価ですi != 1i = 1

しかし、私はそれが紛らわしいと思い、使用したでしょう:

if (i <= 1) {
  return false;
} else {
  // other stuff
}
于 2012-12-14T21:27:40.480 に答える
1

そのコード行のポイントは、1つで2つの目標を達成することです。

  • まず、ブール変数を作成する必要があります
  • 第二に、彼らは数が1であるかどうかをチェックする必要があります、そしてそれは素数ではありません

彼らは両方を同時にやっているだけです。

于 2012-12-14T21:34:36.673 に答える