【问题标题】:Prime number loop stop at first found number [closed]素数循环在第一个找到的数字处停止[关闭]
【发布时间】:2014-05-17 22:29:13
【问题描述】:

您好,我希望下面的循环生成一个低于 1000 的随机素数。但仅使用变量 $i 生成 1,并且变量 $finish 应该允许 while 循环在找到第一个素数后停止,如果number 不是质数,它应该随机生成一个新的 $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 的素数后停止代码?

【问题讨论】:

  • 你的问题是?
  • 我该如何修改它,以便在找到第一个低于 1000 的素数后停止代码?

标签: php


【解决方案1】:

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

您将标志设置为字符串和整数,而这里的布尔值就足够了。除此之外,一旦找到除数 &gt;= 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 并缩短循环 -> 脚本更快。

【讨论】:

  • 如何将 sqrt($number) 添加到下面的代码中?
【解决方案2】:

要在条件匹配时跳出 2 个循环,您可以使用 break 2:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2021-08-19
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多