Prime数字循环在第一个找到的数字处停止

时间:2014-05-17 22:29:13

标签: php

您好我希望下面的循环生成一个低于1000的随机素数。但是只生成变量$ i和变量$ finish应该允许while循环在找到第一个素数后停止并且如果数字不是素数,它应该随机生成一个新的$ i变量,并检查它是否是一个素数,直到找到第一个素数。

<html>
  <body>
  <?php
    $finish="a";
    while($finish = "a") {
      $i = (mt_rand(0,999));
      $counter = 0; 
      for($j = 1; $j <= $i; $j++) { //all divisible factors
        if($i % $j == 0) { 
          $counter++;
        }

        //prime requires 2 rules ( divisible by 1 and divisible by itself)
        if($counter == 2){
          print $i." is Prime <br/>";
          $finish = "b";
        }  
      }
  }
  ?>
  </body>
</html>

如何修改它以便在找到1000以下的第一个素数后停止代码?

2 个答案:

答案 0 :(得分:2)

问题是$finish="a" - 您要将字符串a truthy )分配给$finish。所以这个循环将永远运行(条件始终为真)。

您将标志设置为字符串和整数,而布尔值就足够了。除此之外,一旦找到除数>= 2,您就可以停止for()循环。如果你引入一个辅助函数,它就会变得更具可读性。

function isPrime($number) {
    $max = $number;
    for ($i=2; $i < $max; $i++) {
        if ($number % $i == 0)
            return false;
    }
    return true;
}

do {
    $i = mt_rand(100, 9999);
} while ( ! isPrime($i) );

var_dump($i);

See it work here.我不太确定,sqrt($number)应该足够$max并缩短循环次数 - &gt;脚本更快。

答案 1 :(得分:0)

要在条件匹配时中断2个循环,您可以使用break 2

if($counter == 2){
  print $i." is Prime <br/>";
  $finish = "b";
  break 2;
}