序文
今日、私は数字が素数であるかどうかを判断することは難しくないと思われる質問を見ました。したがって、私はそれを実装することにしました。
DOM構造
<!doctype html> <html lang = "en"> <head> <meta charset = "utf-8"> <title> 500以内のプライム番号を計算します</title name> <meta name = "viewport" content = "width = device-width、iniveryscale = 1.0、maximut-scale = 1.0、ユーザースケーブル= 0 src = "http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"> </script> </head> <body> <div> <input type = "text" id = "num" value = ""> <input type = "button" id = "" submit "" " value = "submit" "> </div> </body> </html> <script> $(function(){$("#submit ")。on( 'click'、function(){var num = $("#num ") composite ");}});}); </script>上記のように、iSprimenum(num)関数を使用して、それが素数であるかどうかを判断します。以下にこの関数を実装しましょう。
for loopを使用して、それがプライムナンバーであるかどうかを判断します
関数isprimenum(num){for(var i = 2; i <num; i ++){if(num%i == 0){return false;}}; return true;}原則は比較的単純です。ターゲット数を2つ以上のターゲット番号で常に見つけることにより、0を取得できる場合、これは素数ではなく複合番号であることを意味します。
しかし、この計算は少し大きいようです
最初の方法を最適化します
それは非常にシンプルで、しばらくの間実装されています。ただし、最適化できるようです。この番号を追いかけて残りを見つける必要はありません。この数値の半分にループするだけで、この数値が素数であるかどうかを計算する必要があります。
関数isprimenum(num){for(var i = 2; i <num/2+1; i ++){if(num%i == 0){return false;}}; return true;}実際の測定の後、速度は実際に大幅に改善されましたが、数のマンティッサが偶数または5であることを知っているので、それは間違いなく素数ではないので、それを計算する必要はありません。もう一度最適化しましょう
マンティッサが偶数または5である計算数はありません
関数isprimenum(num){if(!isdual(num)){return false;} for(var i = 2; i <num/2+1; i ++){if(num%i == 0){return false;}};} function function isdual(num){var num = num = num.toString(); num.substring(num.length-1、num.length); return lastnum%2 == 0 || lastnum%5 == 0? false:true;}このような最適化により、計算の量と少なくとも半分を減らすことができます。 (しかし、実際の測定はパフォーマンスを改善します。なぜなら、そのような数字は素数ではないとすぐに判断できるため)
ここで、Substring()関数は、数値では使用できないが、文字列でのみ使用できることを発見しました。悲しいことに、数字は最初に文字列に変わります。
数や整数処理ではない場合
ユーザー入力が数字や小数でない場合はどうすればよいですか?私はすぐにそれを処理するために2つの方法を書きました...
function isprimenum(num){if(!isnum(num)){return false;} if(!isinteger(num)){return false;} if(!isdual(num)){return false;} for(var i = 2; i <num 2+1; i ++){if(num%i == 0){return false;};};}; isinteger(num){return num == ~~ num? true:false;}関数isnum(num){var num = num.tostring(); var lastnum = num.substring(num.length-1、num.length); return lastnum%2 == 0 || lastnum%5 == 0? false:true;}ここでは2つのヒントが使用されています。1つは小数~~ numを丸め、もう1つは文字列を数値に変換することです。 +num。
以前のブログ投稿「JS JavaScript Learning(i)by Fungleoのふりをするスキル」を読んでください
これは効率を改善するものではありませんが、計算エラー入力を排除するだけです。もう一度考えてみましょう、それが素数ではないかどうかを迅速に判断する方法はありますか?
3で割り当てられる可能性のある数値を削除し、計算しない
function isprimenum(num){if(!isnum(num)){return false;} if(!isinteger(num)){return false;} if(num == 2 || num == 3 || num == 5){return true;} if(!isdual(num){return false;} if(!isthree(num)) num/5+1; i ++){if(num%i == 0){return false;}};}関数isinteger(num){return num == ~~ num? true:false;}関数isnum(num){return num == +num? true:false;}関数isdual(num){var num = num.tostring(); var lastnum = num.substring(num.length-1、num.length); return lastnum%2 == 0 || lastnum%5 == 0? false:true;} function inthree(num){var str = num.tostring(); var sum = 0; for(var i = 0; i <str.length; i ++){sum+=+str.substring(i、i+1);}; return sum%3 == 0? false:true;}ここでは、最初に番号を文字列に変換し、次に文字列の各ビットを分割し、追加と合計を分割し、結果を使用して3つを使用して残りを見つけます。次に、この数値を3で区切ることができるかどうかを確認できます。
ハハ私はとても賢いです...実際のテストパフォーマンスはあまり改善されていませんが、実際には少し改善されています。少し落ち込んでいます
ただし、3部門の数字を除外する場合、その半分を計算する必要はありません。その半分を計算する必要はありません。3分の1を計算するだけです。さらに、5を除外したため、5分の1を計算するだけです...
迅速な調整後、効率が大幅に改善されました!!!私は強力です...
ただし、このようにして、コードは2/3/5の複合番号であると判断します。したがって、別の文を追加する必要があります。
if(num == 2 || num == 3 || num == 5){return true;}他の人の方法
その後、最適化方法を考えることができませんでした...それで、私は検索して、次の解決策を見つけました。ショックを受けました!!!
関数isprimenum2(num){return!/^。?$ |^(..+?)/1+$/。テスト(array(num+1).jein( '1'))}}通常の方法が使用されていますが、確かに短いですが、読んでも理解できます!!!
私は本当に原則が何であるかを本当に理解していないので、実際のテストを受けて、私のコード効率がこのコードよりもはるかに高いことを発見しました。このことから、私の方法はまだ非常に優れていることがわかります!!
コードが100000以内にすべてのプライム番号を印刷するには1600ミリ秒かかり、このコードは160000msかかります。つまり、私のコードは1%しかかかりません。
ただし、誰かがこのコードを理解できる場合は、私に説明してください...
補充します
いくつかの関連情報を読んだ後、上記のnum/5を使用した方法はあまり良くないようです(結果は間違っていません)。より良い方法があります。これは、Math.sqrt(num)を使用して平方根を見つけることです。
私のコードテスト結果は次のとおりです
上の図に示すように、私のコードの計算結果は完全に正しいです。ただし、1638ミリ秒かかりました。多くのテストの後もそうです。
平方根法のテスト結果は次のとおりです
上の図に示すように、この方法はより科学的で高速です。複数のテストがかかり、1150ミリ秒から1250ミリ秒かかります。私のコードパフォーマンスと比較して、約25%です。
また、数字が均一か5か、合計を3で割ることができるかどうかを判断します。これは長い時間でした。私は間違いなく運用の量を減らすことを望んでいます。しかし、これらのコード自体にも操作量があります。すべてのコードを削除してから見ます。
パフォーマンスは再び改善されました。私のすべての計算は否定的に最適化されているようです!
最後に、コードは次のとおりです。
function isprimenum(num){if(!isnum(num)){return false;} if(!isinteger(num)){return false;} for(var i = 2; i <= math.sqrt(num); i ++){if(num%i == 0){return false;} true:false;}関数isnum(num){return num == +num? true:false;}概要:それは完全に私の貧しい算術のためであり、私を正面で賢くしました。ただし、小さなテクニックを実践することも良い-_- |||です
最後に、100万以内のすべての素数を計算するのにどれくらいの時間がかかるかを見てみましょう
上記は、数字が編集者によって導入された素数であるかどうかを判断する方法の要約です。私はそれが誰にでも役立つことを願っています。