素数は規則的に分布していません。これは、隣接する 2 つの素数の差に反映される可能性があります。
2と3の差は1、3と5の差は2、5と7の差は確かに2ですが、7と11の差は4です。
一見しただけではパターンがわかりません、それは本当です。
2 と 50 の間で、2 の差がある次の隣接する素数のペアを見つけることができます:
3-5、5-7、11-13、17-19、29-31、41-43
明らかに、上記の条件を満たす最初の素数のペアは 3 ~ 5 です。
それでは、より一般的なケースで、m から n まで g のギャップを持つ隣接する素数の最初のペアは何でしょうか?
関数のプロトタイプは次のとおりです:
gap(g, m, n)
例は次のとおりです:
gap(2, 5, 7) // --> [5, 7] gap(4, 130, 200) // --> [163, 167] gap(2, 5, 5) // --> null
g の差を満たす隣接する素数の最初のペアである必要があることに注意してください。
見つからない場合は null を返します。
素数を扱うこの種の質問では、必然的に素数を決定する関数を導入する必要があります。この関数が ECMA 標準に組み込まれたらどんなに素晴らしいだろうと思わずにはいられません。
しかし、汎用性を考えると、この isPrime メソッドの適用シナリオは確かに少し狭く、Number.prototype にバインドするのには適していないため、何度も問題を行うときに剥がして貼り付けるしかありませんが、汗^_^。
この質問自体は難しくありません。ループ内で、修飾された素数のペアが存在しない場合は、null を返します。
Number.prototype.isPrime = function(){ var maxFactor = Math.floor(Math.sqrt(this)); for(var i=2;i<=maxFactor;i++){ if(this % i === 0){ return false; } } return true; }; function gap(g, m, n) { var firstPrime; var secondPrime; for(var i=m;i<=n;i++){ if(i.isPrime()){ firstPrime = secondPrime; secondPrime = i; if(secondPrime - firstPrime === g){ return [firstPrime,secondPrime]; } } } return null; }
上記は JavaScript に関する興味深い質問です。素数の違いについては、PHP 中国語 Web サイト (www.php.cn) をご覧ください。