ある数より小さい素数の総数を求めるプログラムがうまくいきません。
数が次のように入力されます
2<与えられる数<100000
date1.taxt
15 210 3500 4900 54000 68000 710000 830000 956000 1089000
例えば5よりも小さい数字で素数になるのは、2,3なので、素数は2個になります。
10よりも小さい数字で素数になるのは、2,3,5,7なので、素数は4個になります。
以下、私のコードです。
php
1<?php 2 3$STDIN = fopen("date1.txt","r"); 4$time_start = microtime(true); //処理時間計測 5 6for ($s=0; $s < 10; $s++) { 7 8 $input = fgets($STDIN); 9 $jadge = 0; 10 $ans = 0; 11 12 for ($i=2; $i < $input ; $i++) { 13 $two = $i%2; 14 if($two == 0 ){ 15 16 }else{ 17 for ($k=2; $k <$i; $k++) { 18 $j = $i%$k; 19 if ($j == 0) { 20 $jadge += 1; 21 } 22 } 23 if ($jadge < 1) { 24 $ans +=1; 25 } 26 } 27 $jadge = 0; 28 29 } 30 31echo $ans."\n"; 32 33} 34 35$timelimit = microtime(true) - $time_start; //計測終了 36echo $timelimit . "秒\r\n"; //表示 37 38fclose($STDIN); 39 40?>
実行結果
2
4
95
154
550
1007
1229
3245
5683
--ここで1分ほど待っても計算が進まなくなる--
やはり数が大きくなると実行時間がかかりすぎるのか、はたまたオーバーフロー?してるのかでうまくいきません。
オーバーフローしている時はエラーコードがちゃんとでてくれるのでしょうか?
また、調べてみるとこのプログラムを高速化するアルゴリズムとして
・あらかじめ2の倍数判断を全て省く
・あらかじめ3の倍数判断を全て省く
・いままでに現れた倍数判断を全て省く
などが挙げられるそうですがそれはどのようにコードに反映すればいいのでしょうか?
あと、私はたまたまphpでやっているのですがこういう計算系はC++とかの方が有用ですか?
よろしくお願いします。

回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。