Information

  • 猟団ホーム : シリアス ランド8
    猟団内での交流目的、放置したい時等々、自由に利用して下さい。
  • StartUp 4 MHF
    便利なツールも付属したMHF用のスタートページ。
    詳細はココ!

アクセスカウンタ

  • 合計:470556  今日:47  昨日:72

最近の記事

最近のコメント

過去記事

カテゴリ

リンク

管理者用

煽られたので素数を判定するコードを載せてみる

2015年06月01日 18時16分08秒
貴様の無駄な時間: 1分38秒くらい

こんばんは!団員aです!
今回はMHFとはまったく関係のない内容です!
画像は載せるものがなかったのでダミーです!
よろぴく、あっ、よろっ、あっ…。
噛んじゃったので、もう言いません!

…………………………
…………………………
…………………………

はい、タイトル通り素数を判定するプログラムです。
どうしてこんなものを載せることになったのかと言うと…

frfr「aさん、極征はレベルいくつまで到達したのですか?」
a「233かな。51番目の素数だね」
frfr「どうして51番目だとわかったんですか?」
a「ググったw」
frfr「理知的で通ってるaさんがそんなものに頼るんですか」

記憶から引っ張りだしてるので一字一句あっているわけではないけど、
おおよそこんな感じのチャットで煽ってくるのです。
代償つけて死神の抱擁ひいて、再燃で復活して卍解して六華閃舞で殺してやろうかと思いましたが、
ここはグッと抑えてコード書いて見せつけてやろうという考えに至りました☆

というわけでデモとソースコードです。
動作としては、任意の数を入力しボタンを押下すると
素数かどうか判定し、さらに素数であった場合、それが何番目の素数なのかも示します。

デモ

 

ソースコード

  $(function(){
    //素数の判定
    function isPrime(x){
      var ret = true;
      while(1){
        //2の倍数は事前に除外。ただし2だったらtrue
        if(x % 2 == 0){
          ret = x == 2;
          break;
        }
        //3の倍数は事前に除外。ただし3だったらtrue
        if(x % 3 == 0){
          ret = x == 3;
          break;
        }
        //xを5から奇数毎に剰余を求める。剰余が0だったら割り切れることになるのでfalse
        //√xまで割り切れずに到達したら素数と判定しtrueを返す
        for(var i = 5; i <= Math.sqrt(x); i+=2){
          if(x % i == 0){
            ret = false;
            break;
          }
        }
        break;
      }
      return ret;
    }
    
    //素数の判定および目的値までの素数一覧を返す
    function searchPrimes(x){
      var primes = [];
      var temp;
      var ret = {list: [], result: false};
      for(var i = 2; i <= x; i++){
        temp = isPrime(i);
        if(temp == true) primes.push(i);
        if(i == x && temp == true) ret = {list: primes, result: true}
      }
      return ret;
    }
    
    $("#is_prime").on("click", function(){
      var x = $("#num").val();
      var ret2, msg = "";
      
      if(typeof(parseInt(x, 10)) == 'number' && x != ''){
        ret2  = searchPrimes(x);
      
        if(ret2['result'] == true)
          msg = "数" + x + "は" + ret2['list'].length + "番目の素数です。
" + ret2['list'].join(', ');
        else
          msg = "数" + x + "は素数ではありません。";
      }
      else{
        msg = "入力内容に問題があるため判定できません。"
      }
      
      $("#result").html(msg);
    });
  });

コードはJavascriptで記述しています。
少し解説しとくと、素数というのは1と自分自身の数を約数に持つ正の自然数なので、
それ以外の数で割り算することはできません。
なので、小さい数から順番に割り算を行い、
割り切れたらNG、割り切れなかったらOK(=素数)として判定することができます。
上記のコードはこの考え方で実践してます。

さらに補足すると、素数判定には多く解法(アルゴリズム)が存在します。
有名なアルゴリズムとして「エラトステネスのふるい」と呼ばれるものがあり、
そちらの方が効率的に算出できるのですが、今回は内容のわかりやすさを重視して
最も単純で正直なアルゴリズムで記述しました。

というわけで、frfr君には頑張って解読して素数を極めて頂きたいと思いますん!


コメント

  • a

    2015年06月01日 20時04分42秒

    プ、が速攻教えてくれたw

    よくわからないけどすごいねえ。

    てかさ、これだと私がコードかける頭のいい人って勘違いくらうからいいか。

  • おG(素数)

    2015年06月01日 22時49分40秒

    ためしに「おちんちん」と入力したところ

    数おちんちんは素数ではありません。

    という回答が出ました
    さすがだなぁとおもいました

  • トゥポル

    2015年06月02日 10時16分44秒

    >a
    いや~さすが副隊長!
    おれたちに書けないコードを平然と記すなんてッ!
    そこにシビれる憧れるゥ~!

    …これでまたじゃでさんが混乱しますなw

    >G様
    一応入力時に数字かどうかのチェックはしてるのだけど、
    ブラウザ毎にコード解釈が微妙に変わってくるので
    おかしな結果になることはあります。

    特にIE、てめーはダメだ。

    …ということは団チャでも説明しましたが。
    その昔ブラウザ界におかれましてはIE一強時代が長く続いたため、
    道を外れて独自実装し続けた結果がこれなのです。
    IEにはいつも泣かされる;;