• ベストアンサー

PHP 素数

自分がPHPを覚えたいということで知り合いから 課題を出されました。その課題が PHPで100までの素数を出すということなのですが、 どうしても分かりません。まったくはじめの段階でいきずまって、なんども書いては消しての繰り返しになっております。 どなたかご存知の方が今したらお伺いできますでしょうか。 <?php $max = 500; $arr = range( 2, $max ); $end = sqrt( $max ); for ( $i = 2; $i < $end; ++$i ) {

noname#130289
noname#130289
  • PHP
  • 回答数3
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

じゃあ私は「エラトステネスのふるい」で <?php $max_num = 100; // 100までの素数を求める $array = range(0, $max_num); // 0-100までの配列を準備する // 素数でないものは配列の値を0にする // $array[0]はもともと0なので$array[1]だけ0にセット $array[1] = 0; // 平方根の値までを調べればよい $limit_num = (int)sqrt($max_num); // 素数の倍数は素数ではないので0にする // 2から$limit_numまでループ for ($search = 2; $search <= $limit_num; $search++) { if ($array[$search]) { // 0でないということは素数 // 素数の2倍以上の倍数を0に for ($delete = $search * 2; $delete <= $max_num; $delete += $search) { $array[$delete] = 0; } } } foreach ($array as $val) { // 値が0でないものは素数なので表示 if ($val) echo $val . " "; } ?>

noname#130289
質問者

お礼

ご丁寧に教えてくださりありがとうございます。 さっそく勉強をさせて頂きます。 どうもありがとうございました!!

その他の回答 (2)

noname#26650
noname#26650
回答No.2

サンプルです。 <?php echo "2"." "; for ($i = 3; $i <= 100; $i += 2) {   for ($j = 2; $j * $j <= $i; $j++) {     if ($i % $j == 0) {       break;     }   }   if ($j * $j > $i) {     echo $i." ";   } } ?> (注)インデントのため、全角空白を使っています。

  • maura
  • ベストアンサー率46% (48/104)
回答No.1

<?php function checkifprime($prime){ for($i = 2; $i < sqrt($prime); $i = $i + 2){ if ($prime % $i == 0){ return false; } } return true; } echo "2"." "; for($i = 3; $i <= 100; $i = $i +2){ if(checkifprime($i)){ echo $i." "; } } ?>

noname#130289
質問者

お礼

さっそくのご返答ありがとうございます。 さっそく勉強をさせて頂きます。 ただまだ初心者のため解読できるのに知らない書き方が多いので時間がかかってしまいそうです。もし他に簡単?ともうしますか、書き方があり、ご存知でしたらお伺いできますか。 申し訳ございません。でもありがとうございました。

関連するQ&A

  • 素数列挙 Ruby

    1000までの素数を列挙するプログラムは書けました。 def s(max) arr=(2..max).to_a (2..Math::sqrt(max)).each do |i| arr.delete_if {|a|a % i == 0 && a!=i} end arr end puts s(1000) 今度は10の10乗から10の11乗の間に存在する素数を列挙するプログラムを書きたいのです。 時間は気にしないので、上の試し割り方法で良いです。助けてください。 また、メモリの上限を変更する必要がありますか?ないとしたら、どの範囲から変更は必要ですか。 10の20乗から?30乗から? 本当の初心者なのでどうかよろしくお願いします。

  • <?php $arr = [2,4,6,8,10]

    phpでこの式はどういう仕組になっているのか教えて下さい for文カウンタ変数 <?php $arr = [2,4,6,8,10]; for($i = 0; $i <= 4; $i++){ echo $arr[$i]."\n"; }

    • ベストアンサー
    • PHP
  • phpでこれはどういう仕組になっているんでしょうか

    phpでこれはどういう仕組になっているんでしょうか? echo $sumは 2+0 4+0 6+0 8+0 10+0で30ということですか? <?php $arr = [2,4,6,8,10]; $sum = 0; for($i = 0; $i <= 4; $i++){ $sum += $arr[$i]; } echo $sum."\n";

    • ベストアンサー
    • PHP
  • PHPで 配列

    PHPを三日前から知り合いの助けのもとはじめたのですが、その中で 配列の応用の問題があり、それを解こうとずっとやっているのですが、 どうしても分かりません。 問題というのが、1から100までの数字を全てかけた答えを出力する。 1*2*3*4*・・・ その方法とそれ以外に一桁まで全て出るようにしたいのですが、 どうしても分かりません。 なんども書いては消してやっているのですが、 今のところ 多分range(1,100);や sqrtを使うのではないかと 思っているのですが、どうにも分かりません。 出来るだけスクリプトを書いてから質問をしたかったのですが、 混乱のさなかのためできませんでした。 どなたかお分かりになるかたが今したらお伺いできますでしょうか。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • phpでハイパーリンクして値を持っていきたい

    今phpを使ってhtmlのタグを使いハイパーリンクして値を持っていきたいのですけどよくわかりません for($i;$i>=0;$i--){ echo '<a href="user.php">'.$arr[$i].'</a><br />'; echo $i; このようにプログラムは書いてます user.phpに arr[$i]の値をそれぞれ持っていきたいのですけど どのように書けばいいでしょうか?

    • ベストアンサー
    • PHP
  • 速度比較用コードってこれでいいんですか?

    いろんな言語で同じ処理を行わせて速度を測定し、結果もっとも良いパフォーマンスのする言語でコーディングをしようとしています。しかしネットでいくら調べても見つかるのは速度比較の結果のみで、どんなコードで測定したのかは書いてありません。一応、自分なりに考えて以下のようなPHPコードを組んだのですが、このような感じで良いのでしょうか?冒頭で「いろんな言語で」と言いましたが、ここではPHP限定とします。 <? $arr; define("max", 100000); for($i=0; $i<max; $i++) { $arr[$i] = $i; } $mode = 1; $beforeStamp = microtime(true); if ($mode == 0) { for($i=0; $i<max; $i++) { print $arr[$i]."<br />"; } } else if ($mode == 1) { $i = 0; while ($i < max) { print $arr[$i]."<br />"; $i++; } } else if ($mode == 2) { foreach($arr as $value) { print $value."<br />"; } } $afterStamp = microtime(true); print ($afterStamp-$beforeStamp)." / ".$afterStamp." / ".$beforeStamp; ?> 概要ですが、定数maxに設定した数(ここでは10万)の配列を生成し、それを呼び出すというプログラムです。$modeに代入する数値0,1,2のいずれかで呼び出し用メソッド(?)を決め、全配列の中身を呼び出します。メソッド(っていうのも違う気がしますが)はそれぞれfor文、while文、foreach文になっています。これらの処理にかかる速度を測定し、配列の値を呼ぶにはどの方法が一番速いのかを調べたいのです。 間違いがあったり、もっと効果的な方法がありましたら是非ご教授くださいませ。よろしくお願いします。

    • 締切済み
    • PHP
  • NEW ARRAY!!

    配列にデータを格納しようとしているのですが、 うまくいきません。アドバイスをお願いいたします。 -------------- <?php <省略> $number = 100; <省略> ?> <script language="javascript"> <!-- Begin arr = new Array(10); for(i=0;i<10;i++){ arr[i] = <?=$number?> - 1; } // End --> --------------------------- 配列arrにデータ('100','99','98', ・・・, '91')と 格納したいのですが、うまくいきません。 宜しくお願いいたします。

  • どのような関数名を付けるべきなのでしょうか?

    比重(比率)を利用して乱数を取得したいと思って、 そのような関数を探してたのですが見つからなかったので自作したのですが、 関数名の付け方に迷いがあるのでアドバイス頂けないでしょうか? 例えば array(  array('weight' => 3, 'min' => -3, 'max' => -1),  array('weight' => 7, 'min' => 4, 'max' => 5), ) と値を渡せば、 30%の確率で-3から-1の間でランダムした結果を取得 70%の確率で4から5の間でランダムした結果を取得 できます。 比重(weight)を利用してるので 「randByWeight」 と仮に名前を付けたのですが、 自分としてはそもそも文法的に合ってるのかも曖昧ですし、 プログラム的な命名規則に則してるかも分かりません・・・ まあそんなに深く考えずに「myrand」とかでもいいんでしょうけど、 この関数の作り方や設計の誤りなども含めてアドバイスして頂きたいです。 /**  * randByWeight  *   * @param $params  * @return int  */ function randByWeight($params) {  if (!isset($params[0])) {   $params = array($params);  }    $index = 0;  $range = array();  foreach ($params as $param) {   if ($index >= 1){    $range[$index]['start'] = $range[$index - 1]['end'] + 1;   } else {    $range[$index]['start'] = 1;   }   $range[$index]['end'] = $range[$index]['start'] - 1 + (isset($param['weight']) ? $param['weight'] : 1);   $index++;  }   // srand( (int)( ((float)microtime()) * 1000000 ) );  $ran = rand(1, $range[$index - 1]['end']);  for ($i = 0; $i < $index; $i++) {   if ($range[$i]['start'] <= $ran && $ran <= $range[$i]['end']) {    if (isset($params[$i]['recursive']) && is_array($params[$i]['recursive'])) {     return randByWeight($params[$i]['recursive']);    } else {     if($params[$i]['min'] > $params[$i]['max']) {      $params[$i]['min'] = $params[$i]['max'];     }       return rand($params[$i]['min'], $params[$i]['max']);    }   }  } } // 使用例 $arr = array(  array('weight' => 3, 'min' => -10, 'max' => 1),  array(   'weight' => 1,   'recursive' => array(    array('weight' => 1, 'min' => 2, 'max' => 2),    array(     'weight' => 10,     'recursive' => array(      array('weight' => 3, 'min' => 3, 'max' => 3),      array('weight' => 7, 'min' => 4, 'max' => 4),     ),    ),   ),  ), ); $result = array(); for ($i = 1; $i <= 100; $i++) {  $result[randByWeight($arr)]++; } $sum = 0; ksort($result); foreach ($result as $value => $cnt) {  print "{$value}:{$cnt}<br>\n";  $sum += $cnt; } print "sum={$sum}<br>\n";

    • ベストアンサー
    • PHP
  • 2進→10進数

    2進数から10進数に変換するプログラムを作りたいんですが #include<stdio.h> main() { int a[8],i=0,ans=0,end; start: printf("2進数を10進数に変換するプログラム\n開始する場合は1を入力終了する場合は0を入力してください。\n"); scanf("%d",&end); if(end==1) { goto s1; } else if(end==0) { goto end; } { s1: for(i=0;i<8;i++) { scanf("%d",&a[i]); } for(i=0;i<8;i++) { a[i]=2^i; } for(i=0;i<8;i++) { ans=ans+a[i]; } printf("二進数"); for(i=8;i<=4;i--) { printf("%d",a[i]); } printf(" "); for(i=4;i<=0;i--) { printf("%d",a[i]); } printf("は%dです。\n",ans); goto start; } end: printf("終了します\n"); } 期待した結果が得られないのですがどこが違っているのか教えていただきたいです、お願いします。

  • javaで素数を探すプログラム。

    javaで素数を探すプログラム。 初歩的なことかと思いますが、助言をお願いします。 if(a[i-1]) ←この部分がわかりません。これはどのような条件がなのでしょうか? class Prime { public static void main(String[] args) { int max = 100; // 素数を探す数の最大値 boolean[] a = new boolean[max]; // 素数かどうか判定する配列 // 配列の初期化 for(int i = 0; i < max; i++) a[i] = true; // 素数かどうか判定 for(int i = 2; i < max; i++) { if(a[i-1]) { for(int j = 2; i*j <= max; j++) a[i * j - 1] = false; } else continue; } // 結果を表示 for(int i = 1; i < max; i++) { if(a[i]) System.out.print((i + 1) + " "); } System.out.println(); } } このプログラム

    • ベストアンサー
    • Java

専門家に質問してみよう