61

Javascript で 0 から 100 までの素数を見つけるにはどうすればよいですか? 私はそれについて考えましたが、それらを見つける方法がわかりません。x % x を実行しようと考えましたが、明らかな問題が見つかりました。これは私がこれまでに持っているものです。残念ながら、これは史上最悪のコードです。

var prime = function (){
var num;
for (num = 0; num < 101; num++){
    if (num % 2 === 0){
        break;
    }
    else if (num % 3 === 0){
        break;
    }
    else if (num % 4=== 0){
        break;
    }
    else if (num % 5 === 0){
        break;
    }
    else if (num % 6 === 0){
        break;
    }
    else if (num % 7 === 0){
        break;
    }
    else if (num % 8 === 0){
        break;
    }
    else if (num % 9 === 0){
        break;
    }
    else if (num % 10 === 0){
        break;
    }
    else if (num % 11 === 0){
        break;
    }
    else if (num % 12 === 0){
        break;
    }
    else {
        return num;
    }
}
};
console.log(prime());
4

40 に答える 40

84

JavaScript でのふるい実装の例を次に示します。

function getPrimes(max) {
    var sieve = [], i, j, primes = [];
    for (i = 2; i <= max; ++i) {
        if (!sieve[i]) {
            // i has not been marked -- it is prime
            primes.push(i);
            for (j = i << 1; j <= max; j += i) {
                sieve[j] = true;
            }
        }
    }
    return primes;
}

次にgetPrimes(100)、2 ~ 100 (両端を含む) のすべての素数の配列を返します。もちろん、メモリの制約により、これを大きな引数で使用することはできません。

Java 実装は非常によく似ています。

于 2012-09-05T18:26:38.017 に答える
58

これが私がそれを解決した方法です。Java から JavaScript に書き直したので、構文エラーがあればすみません。

function isPrime (n)
{
    if (n < 2) return false;

    /**
     * An integer is prime if it is not divisible by any prime less than or equal to its square root
     **/

    var q = Math.floor(Math.sqrt(n));

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

    return true;
}

n1 とそれ自体以外の数で割り切れない数 は、素数です。また、数値 [2, sqrt(n)] を確認すれば十分です。

于 2012-08-15T10:15:55.183 に答える
32

このスクリプトのライブ デモは次のとおりです: http://jsfiddle.net/K2QJp/

まず、単一の数値が素数かどうかをテストする関数を作成します。Number オブジェクトを拡張したい場合は可能ですが、コードをできるだけ単純にすることにしました。

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

このスクリプトは、その数値より 2 から 1 少ないすべての数値を調べ、数値を増分で割った場合に余りがない数値があるかどうかをテストします。余らないものがある場合、それは素数ではありません。数値が 2 未満の場合、素数ではありません。それ以外の場合は、プライムです。

次に、0 から 100 までの数値をループする for ループを作成し、その関数で各数値をテストします。素数の場合、その数をログに出力します。

for(var i = 0; i < 100; i++){
    if(isPrime(i)) console.log(i);
}
于 2012-08-15T09:15:09.667 に答える
12

不要な繰り返しをカットするために、Sundaramアルゴリズムのふるいを少し変更しましたが、非常に高速に見えます。

このアルゴリズムは、このトピックで最も受け入れられている@Ted Hopp のソリューションよりも実際には 2 倍高速です。0 ~ 1M の間の 78498 個の素数を解くには、Chrome 55 では 20 ~ 25 ミリ秒、FF 50.1 では < 90 ミリ秒かかります。また、@vitaly-t の get next prime アルゴリズムは興味深いように見えますが、結果ははるかに遅くなります。

これがコアアルゴリズムです。セグメンテーションとスレッド化を適用して、優れた結果を得ることができます。

"use strict";
function primeSieve(n){
  var a = Array(n = n/2),
      t = (Math.sqrt(4+8*n)-2)/4,
      u = 0,
      r = [];
  for(var i = 1; i <= t; i++){
    u = (n-i)/(1+2*i);
    for(var j = i; j <= u; j++) a[i + j + 2*i*j] = true;
  }
  for(var i = 0; i<= n; i++) !a[i] && r.push(i*2+1);
  return r;
}

var primes = [];
console.time("primes");
primes = primeSieve(1000000);
console.timeEnd("primes");
console.log(primes.length);

ループ制限の説明:

エラストテネスのふるいと同様に、スンダラムのふるいアルゴリズムも、リストから選択されたいくつかの整数を取り消します。取り消し線を引く整数を選択するには、ルールは i + j + 2ij ≤ n です。ここで、i と j は 2 つのインデックスで、n は要素の合計数です。すべての i + j + 2ij に取り消し線を引くと、残りの数が 2 倍されて奇数化 (2n+1) され、素数のリストが表示されます。最終段階は、実際には偶数の自動割引です。その証拠はここで美しく説明されています。

Sundaram のふるいは、ループ インデックスの開始と終了の制限が正しく選択され、非素数の冗長な (複数の) 削除がまったく (または最小限に) 行われない場合にのみ高速になります。取り消し線を引く数字を計算するには i と j の値が必要なので、i + j + 2ij から n までどのようにアプローチできるか見てみましょう。

i)したがって、i と j が等しい場合に取り得る最大値を見つける必要があります。これは 2i + 2i^2 = n です。二次方程式を使用して i の正の値を簡単に解くことができます。t = (Math.sqrt(4+8*n)-2)/4,

j)内側のループ インデックス j は、i から開始し、現在の i 値で移動できるポイントまで実行する必要があります。それ以上はありません。i + j + 2ij = n であることがわかっているので、これは次のように簡単に計算できます。u = (n-i)/(1+2*i);

これにより、冗長な交差が完全に除去されるわけではありませんが、冗長性が「大幅に」除去されます。たとえば、n = 50 の場合 (100 までの素数をチェックするため)、50 x 50 = 2500 を実行する代わりに、合計で 30 回の反復のみを実行します。明らかに、このアルゴリズムは O(n^2) 時間の複雑さと見なされるべきではありません。

i  j  v
1  1  4
1  2  7
1  3 10
1  4 13
1  5 16
1  6 19
1  7 22  <<
1  8 25
1  9 28
1 10 31  <<
1 11 34
1 12 37  <<
1 13 40  <<
1 14 43
1 15 46
1 16 49  <<
2  2 12
2  3 17
2  4 22  << dupe #1
2  5 27
2  6 32
2  7 37  << dupe #2
2  8 42
2  9 47
3  3 24
3  4 31  << dupe #3
3  5 38
3  6 45
4  4 40  << dupe #4
4  5 49  << dupe #5

その中で重複は 5 つだけです。22、31、37、40、49. n = 100 の場合、冗長性は約 20% ですが、n = 10M の場合は約 300% に増加します。これは、SoS をさらに最適化することで、n が大きくなるにつれてさらに速く結果を取得できる可能性を秘めていることを意味します。したがって、1 つのアイデアはセグメンテーションであり、n を常に小さく保つことです。

OK..このクエストをもう少し進めてみることにしました。

i === 1繰り返される交差を注意深く調べた後、場合を除いて、iまたはjインデックス値のいずれかまたは両方が 4、7、10、13、16、19.. の間にあるという事実に気づきました。 . シリーズ、重複交差が生成されます。そして、内側のループを の時だけ回すことi%3-1 !== 0で、さらに全ループ数の 35 ~ 40% 程度の削減を実現。たとえば、1M 整数の場合、ネストされたループの合計ターン数は 1.4M から 1M に減少しました。わお..!ここではほとんど O(n) について話しています。

私はちょうどテストをしました。JS では、1B までカウントする空のループだけで 4000 ミリ秒かかります。以下の修正されたアルゴリズムでは、100M までの素数を見つけるのに同じ時間がかかります。

また、このアルゴリズムのセグメンテーション部分を実装して、ワーカーにプッシュしました。そのため、複数のスレッドも使用できるようになります。しかし、そのコードは少し後で続きます。

では、修正されたスンダラムのふるいをご紹介しましょう。Chrome V8 と Edge ChakraCore を使用して、約 15 ~ 20 ミリ秒で 0 ~ 1M の素数を計算します。

"use strict";
function primeSieve(n){
  var a = Array(n = n/2),
      t = (Math.sqrt(4+8*n)-2)/4,
      u = 0,
      r = [];
  for(var i = 1; i < (n-1)/3; i++) a[1+3*i] = true;
  for(var i = 2; i <= t; i++){
    u = (n-i)/(1+2*i);
    if (i%3-1) for(var j = i; j < u; j++) a[i + j + 2*i*j] = true;
  }
  for(var i = 0; i< n; i++) !a[i] && r.push(i*2+1);
  return r;
}

var primes = [];
console.time("primes");
primes = primeSieve(1000000);
console.timeEnd("primes");
console.log(primes.length);

ええと...最後に、インターネット上で見つけることができた最速のJavaScriptふるいになるように、ふるい(独創的なスンダラムのふるいに由来する)を実装したと思います。 「アトキンスのふるい」。また、これは Web ワーカー、マルチスレッドにも対応しています。

このように考えてください。この控えめな AMD PC では、シングル スレッドで JS が 10^9 までカウントするのに 3,300 ミリ秒かかります。次の最適化されたセグメント化された SoS では、14,000 ミリ秒で 50847534 素数が 10^9 まで計算されます。これは、カウントするだけの 4.25 倍の操作を意味します。印象的だと思います。

自分でテストできます。

console.time("tare");
for (var i = 0; i < 1000000000; i++);
console.timeEnd("tare");

そしてここで、最高のセグメント化された Sundaram の Seieve を紹介します。

"use strict";
function findPrimes(n){
  
  function primeSieve(g,o,r){
    var t = (Math.sqrt(4+8*(g+o))-2)/4,
        e = 0,
        s = 0;
    
    ar.fill(true);
    if (o) {
      for(var i = Math.ceil((o-1)/3); i < (g+o-1)/3; i++) ar[1+3*i-o] = false;
      for(var i = 2; i < t; i++){
        s = Math.ceil((o-i)/(1+2*i));
        e = (g+o-i)/(1+2*i);
        if (i%3-1) for(var j = s; j < e; j++) ar[i + j + 2*i*j-o] = false;
      }
    } else {
        for(var i = 1; i < (g-1)/3; i++) ar[1+3*i] = false;
        for(var i = 2; i < t; i++){
          e = (g-i)/(1+2*i);
          if (i%3-1) for(var j = i; j < e; j++) ar[i + j + 2*i*j] = false;
        }
      }
    for(var i = 0; i < g; i++) ar[i] && r.push((i+o)*2+1);
    return r;
  }
  
  var cs = n <= 1e6 ? 7500
                    : n <= 1e7 ? 60000
                               : 100000, // chunk size
      cc = ~~(n/cs),                     // chunk count
      xs = n % cs,                       // excess after last chunk
      ar = Array(cs/2),                  // array used as map
  result = [];
  
  for(var i = 0; i < cc; i++) result = primeSieve(cs/2,i*cs/2,result);
  result = xs ? primeSieve(xs/2,cc*cs/2,result) : result;
  result[0] *=2;
  return result;
}


var primes = [];
console.time("primes");
primes = findPrimes(1000000000);
console.timeEnd("primes");
console.log(primes.length);

これよりも良くなるかどうかはわかりません。ご意見をお待ちしております。

于 2017-01-02T23:52:51.733 に答える
12

言語が何であれ、範囲内で素数を見つけるための最良かつ最もアクセスしやすい方法の 1 つは、sieveを使用することです。

コードを提供するつもりはありませんが、これは良い出発点です。

あなたのような小さな範囲の場合、最も効率的なのは数値を事前に計算することです。

于 2012-08-15T09:00:01.927 に答える
8

問題の数よりも小さい他の素数で割り切れない場合、その数は素数です。

primesしたがって、これは配列を構築します。より低い値でn見つかった既存の除算に対して、新しい各奇数候補をテストします。最適化として、偶数を考慮せず、最終ステップとして先頭に追加します。primesn2

var primes = [];
for(var n=3;n<=100;n+=2) {
  if(primes.every(function(prime){return n%prime!=0})) {
    primes.push(n);
  }
}
primes.unshift(2);
于 2015-04-14T09:55:58.193 に答える
4

0 から n までの素数を見つける。数値 x が 0 ~ (x の平方根) の間の任意の数値で割り切れるかどうかを確認するだけです。n を渡して 0 から n までのすべての素数を検索する場合、ロジックは次のように実装できます。

  function findPrimeNums(n)
    { 
       var x= 3,j,i=2,
       primeArr=[2],isPrime;
       for (;x<=n;x+=2){
           j = (int) Math.sqrt (x);
           isPrime = true;
           for (i = 2; i <= j; i++)
           {
                if (x % i == 0){
                    isPrime = false;
                    break;
                }
            }
            if(isPrime){
                primeArr.push(x);
            }

        }   

        return primeArr;
    }
于 2014-09-13T12:56:39.007 に答える
3

Luchianの答えは、素数を見つけるための標準的な手法へのリンクを提供します。

効率は劣りますが、より単純なアプローチは、既存のコードをネストされたループに変換することです。2、3、4、5、6などで除算していることを確認し、それをループに変えます。

これが宿題であり、宿題の目的が基本的なプログラミングの学習を支援することであることを考えると、単純で正しいが、やや非効率的なソリューションで十分です。

于 2012-08-15T09:11:25.473 に答える
3

hereの平方根規則と組み合わせた再帰を使用して、数値が素数かどうかを確認します。

function isPrime(num){

    // An integer is prime if it is not divisible by any prime less than or equal to its square root
    var squareRoot = parseInt(Math.sqrt(num));
    var primeCountUp = function(divisor){
        if(divisor > squareRoot) {
            // got to a point where the divisor is greater than 
            // the square root, therefore it is prime
            return true;
        }
        else if(num % divisor === 0) {
            // found a result that divides evenly, NOT prime
            return false;
        }
        else {
            // keep counting
            return primeCountUp(++divisor);
        }
    };

    // start @ 2 because everything is divisible by 1
    return primeCountUp(2);

}
于 2013-11-06T18:48:18.700 に答える
3

以前の素数の値に基づいて、JavaScript で素数を計算する高速な方法を次に示します。

function nextPrime(value) {
    if (value > 2) {
        var i, q;
        do {
            i = 3;
            value += 2;
            q = Math.floor(Math.sqrt(value));
            while (i <= q && value % i) {
                i += 2;
            }
        } while (i <= q);
        return value;
    }
    return value === 2 ? 3 : 2;
}

テスト

var value = 0, result = [];
for (var i = 0; i < 10; i++) {
    value = nextPrime(value);
    result.push(value);
}
console.log("Primes:", result);

出力

Primes: [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ]

以下の理由により、ここで公開されている他の代替手段よりも高速です。

  • ループ制限を整数に合わせます。これにより、はるかに高速に機能します。
  • 偶数をスキップして、より短い反復ループを使用します。

約 130 ミリ秒で最初の 100,000 個の素数、または約 4 秒で最初の 1m 素数を得ることができます。

 function nextPrime(value) {
        if (value > 2) {
            var i, q;
            do {
                i = 3;
                value += 2;
                q = Math.floor(Math.sqrt(value));
                while (i <= q && value % i) {
                    i += 2;
                }
            } while (i <= q);
            return value;
        }
        return value === 2 ? 3 : 2;
    }

    var value, result = [];
    for (var i = 0; i < 10; i++) {
        value = nextPrime(value);
        result.push(value);
    }

    display("Primes: " + result.join(', '));

    function display(msg) {
        document.body.insertAdjacentHTML(
            "beforeend",
            "<p>" + msg + "</p>"
        );
    }

アップデート

これよりも 10 倍高速なソリューションを次に示します。

于 2015-10-01T14:32:00.157 に答える
2
<code>
<script language="javascript">
   var n=prompt("Enter User Value")
     var x=1;
       if(n==0 || n==1) x=0;
          for(i=2;i<n;i++)
           {
          if(n%i==0)
       {
     x=0;
     break;
       }
           }
           if(x==1)
             {
                alert(n +" "+" is prime");
             }
             else
             {
                alert(n +" "+" is not prime");
             }


          </script>

于 2013-10-06T20:43:50.347 に答える
2

これが私の突き刺しです。

最初の値i=0を 0 から任意の値に変更し、2 番目の値i<100を 100 から任意の値に変更して、異なる範囲の素数を取得します。

for(var i=0; i<100000; i++){
    var devisableCount = 2;

    for(var x=0; x<=i/2; x++){
        if (devisableCount > 3) {
            break;
        }
        if(i !== 1 && i !== 0 && i !== x){
            if(i%x === 0){
               devisableCount++;
             }
        }
    }

    if(devisableCount === 3){
        console.log(i);
    }
}

試してみました10000000- 時間がかかりますが、正確なようです。

于 2015-05-13T08:50:17.720 に答える
1
  • すでに2で削除しようとしているのに、なぜ4 (および6,8,10,12 ) で削除しようとするのでしょうか? すでに3で削除しようとしている のに、なぜ9で削除しようとするのでしょうか? 11 * 11 = 121が100より大きい場合、なぜ11で 削除しようとするのでしょうか? 奇数を2で削除しようとするのはなぜですか? 2を 超える偶数を何かで削除しようとするのはなぜですか?



死んだテストを削除すると、 100 未満の素数をテストして、適切なコードが得られます。

そして、あなたのコードは史上最悪のコードとはほど遠いものです。他の多くの人は10099で割ろうとします。2..96しかし、絶対チャンピオンはwithのすべての積を生成して、97がその中にある2..96かどうかをテストします。それは本当に驚くほど非効率的です。

もちろん、エラトステネスのふるいの方がはるかに優れており、ブール値の配列なしで(そして分割もなしで) 100未満の1つを持つことができます:

console.log(2)
var m3 = 9, m5 = 25, m7 = 49, i = 3
for( ; i < 100; i += 2 )
{
    if( i != m3 && i != m5 && i != m7) console.log(i)
    else
    {
        if( i == m3 ) m3 += 6
        if( i == m5 ) m5 += 10
        if( i == m7 ) m7 += 14
    }
} "DONE"

これはエラトステネスのふるいです。コンポジットをスキップすると、このコードが実行されます。コンポジットの生成とスキップのタイミング (等しいかどうかのチェックによる) は、1 つのタイムラインに混在しています。通常のふるいは、最初に複合材料を生成し、それらを配列にマークしてから、配列をスイープします。ここでは、配列をまったく使用する必要がないように、2 つのステージが 1 つにまとめられています (これが機能するのは、上限の平方根 ( 10 ) が事前にわかっていて、それより下の素数 (つまり3,5,7 )のみを使用するためです)。 2の倍数、つまり偶数は事前に暗黙的にスキップされます)。

言い換えれば、これはエラトステネスの増分m3ふるいであり、素数35、および7の倍数の暗黙の優先度待ち行列を形成しm5ます。m7

于 2012-08-16T02:22:26.923 に答える
1

これは、任意のサイズの素数の配列に使用できます。お役に立てれば

 function prime() {
   var num = 2;

   var body = document.getElementById("solution");

   var len = arguments.length;
   var flag = true;

   for (j = 0; j < len; j++) {

     for (i = num; i < arguments[j]; i++) {

       if (arguments[j] % i == 0) {
         body.innerHTML += arguments[j] + " False <br />";
         flag = false;
         break;

       } else {
         flag = true;

       }

     }
     if (flag) {
       body.innerHTML += arguments[j] + " True <br />";

     }

   }

 }

 var data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

 prime.apply(null, data);
<div id="solution">

</div>

于 2016-05-03T09:48:15.010 に答える
1

これは、JS ジェネレーターを使用した効率的で短いソリューションです。JSフィドル

// Consecutive integers
let nats = function* (n) {
    while (true) yield n++
}

// Wrapper generator
let primes = function* () {
    yield* sieve(primes(), nats(2))
}

// The sieve itself; only tests primes up to sqrt(n)
let sieve = function* (pg, ng) {
    yield ng.next().value;
    let n, p = pg.next().value;
    while ((n = ng.next().value) < p * p) yield n;
    yield* sieve(pg, (function* () {
        while (n = ng.next().value) if (n % p) yield n
    })())
}

// Longest prefix of stream where some predicate holds
let take = function* (vs, fn) {
    let nx;
    while (!(nx = vs.next()).done && fn(nx.value)) yield nx.value
}

document.querySelectorAll('dd')[0].textContent =

// Primes smaller than 100
    [...take(primes(), x => x < 100)].join(', ')
<dl>
<dt>Primes under 100</dt>
<dd></dd>
</dl>

于 2020-09-20T23:43:20.343 に答える
0

エラトステネスのふるい法を使用した私のソリューションは次のとおりです。

function gimmePrimes(num) {
  numArray = [];
  // first generate array of numbers [2,3,...num]
  for (i = 2; i <= num; ++i) {
    numArray.push(i);
  }

  for (i = 0; i < numArray.length; ++i) {
    //this for loop helps to go through each element of array

    for (j = numArray[i]; j < numArray[numArray.length - 1]; ++j) {
      //get's the value of i'th element
      for (k = 2; j * k <= numArray[numArray.length - 1]; ++k) {
        //find the index of multiples of ith element in the array
        index = numArray.indexOf(j * k);
        if (index > -1) { //remove the multiples
          numArray.splice(index, 1);
        }
      }

    }
  }
  return numArray; //return result
}
gimmePrimes(100);
于 2016-01-19T10:01:10.393 に答える
0

number が素数かどうかをテストする方法を次に示します。

function isPrime(numb){
  if (numb % 2 == 0) return false;
  for (var i=3; i<= Math.sqrt(numb); i = i + 2) {
    if (numb % i == 0) {
     return false;
    }
  }
  return true;
}
于 2014-08-12T20:11:29.347 に答える
0

for最初に、別のループ ( and )の内部コードを変更してwhile、異なる値に対して同じコードを繰り返すことができるようにします。

問題をより具体的にすると、与えられたnものが素数であるかどうかを知りたい場合は、2 と sqrt(n) の間のすべての値で割る必要があります。モジュールのいずれかが 0 の場合、それは素数ではありません。

すべての素数を見つけたい場合はn、以前に見つけた素数で割るだけで高速化して確認できます。プロセスを高速化するもう 1 つの方法は、2 と 3 を除いて、すべての素数が6*kプラス 1 以下であるという事実です。

于 2012-08-15T09:05:23.447 に答える
0

このようなものはどうですか。

next_prime:
for (var i = 2; i < 100; i++){
    for (var e = 2; e < i; e++){
        if (i % e === 0) continue next_prime;
    }
    console.log(i + '<br>');
}
于 2015-02-05T01:07:37.713 に答える
0

プロンプトメソッドを使用したくないだけで、プログラムが素数を印刷するのを見たいだけの人のために、Rintoの回答を変更しました。その働き

for (n = 0; n < 100; n++) {
    var x = 1;
    if (n == 0 || n == 1) x = 0;
    for (i = 2; i < n; i++) {
        if (n % i == 0) {
            x = 0;
            break;
        }
    }
    if (x == 1) {
        // if prime print the numbers 
        document.write(n);
    } else {
        // if not prime print the number do nothing 
    }
}
于 2014-08-28T18:33:34.560 に答える
0

JS関数で素数かどうかをチェック

function isPrime(num)
        {
            var flag = true;
            for(var i=2; i<=Math.ceil(num/2); i++)
            {
                if((num%i)==0)
                {
                    flag = false;
                    break;
                }
            }
            return flag;    
        }
于 2014-02-15T09:51:29.380 に答える
0

このスレッドで提示される無数のアルゴリズムのいずれかを使用する場合は、それらのいくつかをメモすることを学ぶ必要があります。

インタビューの質問を参照してください:素数を再帰的に生成する最速の方法は何ですか?

于 2012-09-05T18:12:53.967 に答える
0

素数を見つけるには、次の関数を使用します。

function primeNumbers() {
    var p
    var n = document.primeForm.primeText.value
    var d
    var x
    var prime
    var displayAll = 2 + " "
    for (p = 3; p <= n; p = p + 2) {
        x = Math.sqrt(p)
        prime = 1
        for (d = 3; prime && (d <= x); d = d + 2)
        if ((p % d) == 0) prime = 0
        else prime = 1
        if (prime == 1) {
            displayAll = displayAll + p + " "
        }
    }
    document.primeForm.primeArea.value = displayAll
}
于 2012-09-06T17:36:14.857 に答える
0

読みやすい方法でどのように機能するかを示す JSFiddle を作成しました。

アイデアは、isPrime と getPrimeNumbers の 2 つの関数を使用して機能を分離し、Math.pow と初期値 2 を常に使用することです。jsfiddle に添付されている jsFiddle を参照してください

window.onload = function() {
  (function() {
    var cont = document.getElementById('MainContainer');
    var curEl = document.createElement('span');
    var primeNumbers = [2];

    function fillContent() {
        var primeNumbersContent = document.createTextNode(JSON.stringify(primeNumbers));
        curEl.appendChild(primeNumbersContent);
        cont.appendChild(curEl);
    }

    function isPrime(n) {
        var divisor = 2;
        while (n > divisor) {
            if (Math.pow(divisor, 2) > n) {
                return true;
            }
            if (n % divisor == 0 || Math.sqrt(divisor) > n) {
                return false;
            } else {
                divisor++;
            }
        }
        return true;
    }

    function getPrimeNumbers(range) {
        for (var i = 3; i <= range; i+=2) {
            if (isPrime(i)) {
                primeNumbers.push(i);
            }
        }
        fillContent(primeNumbers);
    }
    getPrimeNumbers(11);
  })();
};
于 2015-12-30T14:47:34.027 に答える
-1
<html>
<head>
<script type="text/javascript">
function primeNumber() {
 x=document.getElementById('txt_field').value;
  for (i=1; i<=parseInt(x); i++) {
  var flag=0,flag1=0; 
    for (j=2; j<i; j++) {
      if(i%j==0){
       flag=1;
      if(i==x)
       flag1=1;
      }
    }
   if(flag==0)
    document.write(i+'<br>');
  }
   if(flag1==0) 
    document.write('Its a prime number.');
   else 
    document.write('Its not a prime number.');
}
</script>
</head>

<body>
 <input id="txt_field" type="text" name="field" />
 <input type="button" name="submit" value="Submit" onclick="primeNumber();" />
</body>
</html>
于 2013-07-19T05:06:16.500 に答える
-1

誰かがこれを試しましたか?シンプルで効率的です...

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

function PrimeWithin(userinput){
  for(var i = 2; i < userinput; i++){
    if(Prime(i)){
        console.log(i);
    }
  }
}

PrimeWithin(500);
于 2014-11-19T14:04:07.027 に答える