0

次のコードは、プラグインした n の値に関係なく、常に true を返すように見えますが、その理由はわかりません。n = 8 の場合、arr2 には 2、4、および 8 の i の値が含まれている必要がありますか? 誰か説明してくれませんか?どうもありがとうございました。

var primetest = function(n){
    var divisor  = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
    for (var i = 0; i < divisor.length; i++) {
            var arr2 = [];
            if(n%divisor[i] == 0) {arr2.push(i);}
                    if(arr2.length > 1) {prime = false;}
                    else {prime = true;}
                    return prime;
            };
    };
4

4 に答える 4

2

元のコードのいくつかの問題:

  • あなたは1回だけ繰り返しています
  • ループ内で分割を保持する配列を宣言すると、常に最大 1 つの項目が含まれます。

上記の簡単な修正は次のとおりです。

var primetest = function(n){
    var divisor  = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
    var arr2 = [];
    for (var i = 0; i < divisor.length; i++) {
        if(n%divisor[i] == 0) {
            arr2.push(i);
        }
    }
    return arr2.length <=1;
}

ライブ テスト ケース

必要でない場合、除数のリスト全体を反復しない最適化されたコード (それがあなたが達成しようとしていたことだと思います) は次のとおりです。

var primetest = function(n){
    var divisor  = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
    var arr2 = [];    
    for (var i = 0; i < divisor.length; i++) {
        if(n % divisor[i] === 0) {
            arr2.push(i);
            if (arr2.length > 1)
                return false;
        }
    }
    return true;
};

フィドルを更新しました。

于 2013-07-24T13:33:35.843 に答える