PHP - 检查数字是否为素数

时间:2016-06-24 07:42:05

标签: php

我试图创建一个检查数字是否为素数的函数。但是我希望这个功能能够回应用户“素数”。或者' NOT prime' - 那就是我的问题开始的地方。 让我告诉你我的代码:

class IsPrime
{       
    function check($num)
    {
        for ($i = 2; $i < $num; $i++)
        {
            if ($num % $i == 0) 
            {
                echo 'NOT prime';
                break;
            }               
        }
        echo 'Prime';           
    }       
}

$x = new IsPrime();
$x->check(4);

问题在于,当我输入任何素数时 - 它可以正常工作,但是当我输入任何非素数时 - 它也会回显第二个回声,就像这样:'NOT prime prime'

我怎样才能让它回应正确答案?

18 个答案:

答案 0 :(得分:7)

in 54 59字节:

function is_prime($n){for($i=$n;--$i&&$n%$i;);return$i==1;}

$i向下循环$n-1,直到找到$n的除数;如果除数为1,则$n为素数。

添加10个字节以获得更好的性能:

function is_prime($n){for($i=$n**.5|1;$i&&$n%$i--;);return!$i&&$n>1;}

从(约)$isqrt($n)循环1,寻找带有$ i后减量的除数。
如果除数为1,则$i最后为0!$i给出true

此solition使用了一个技巧:对于$n=23$i将在第一次迭代中初始化为1→循环退出。对于较大的偶数平方根($n**.5|0),|1用作+1。对于奇数平方根,不需要+1,因为:如果$n可被root+1整除,则它也可被2整除。不幸的是,这可能会耗费大量的迭代次数;所以你最好

添加另外7个字节以获得更好的性能:

function is_prime($n){for($i=~-$n**.5|0;$i&&$n%$i--;);return!$i&$n>2|$n==2;}

$n=2需要一个特殊情况:初始$i=2$n=2→最后$i=1→返回false

1添加到$n而不是平方根就足以避免失败;但是:

我没有计算迭代次数,只测试了时间消耗;并且仅在TiO中而不是在受控环境中。最后两个版本之间的差异小于几次运行之间的偏差。 稍后可能会添加重要的测试结果。

答案 1 :(得分:4)

您可以检查数字是否为素数,并且不使用此功能使用循环:

var opts = {
  filter: "(&(objectClass=user))",
  scope: "sub",
  client: "*",
  attributes: ['distinguishedName']
};

答案 2 :(得分:1)

正如许多答案指出的那样,你的逻辑代码存在一个问题:当你得到i num % i == 0时,你打印“NOT prime”并退出循环,之后,你仍然打印“主要”。有些人在echo "Prime"移动if-else,但仍然是错误的。一种方法,例如,

class IsPrime
{       
     function check($num)
     {
        $bCheck = True; 
        for ($i = 2; $i < $num; $i++)
        {
            if ($num % $i == 0) 
            {
                 $bCheck = False;
                 break;
            }               
        }
       if $bCheck 
          echo 'Prime';           
       else
          echo 'NOT prime'; 
     }       
  }

 $x = new IsPrime();
 $x->check(4);

答案 3 :(得分:1)

您可以找到从1到极限及其数量的素数和非素数。

public function prime_checker($count){
  $counter=0;
  $no_prime=0;
  for($i=2 ; $i<=$count; $i++ ){
    for($j=2 ; $j<$i ; $j++ ){
      if($i % $j == 0){
        echo $i.'is not prime<br/>';
        $no_prime=$i;
        break;
      }
    }
    if($i != $no_prime){
      $prime_numbers[$counter]=$i;
      $counter=$counter+1;
    }    
  }
  echo '<br/>'.$counter.'prime numbers<br/><br/>';
  for($i=0 ; $i<$counter ; $i++ ){
    echo $prime_numbers[$i].' is  prime<br/>';
  }
}

答案 4 :(得分:1)

如果数字真的是素数,这可能是一个很长的过程。还有一个较短的程序。 我们不需要将for循环运行到数字本身。相反,我们可以将它运行到最高整数小于或等于数字的平方根。

class IsPrime
{       
     function check($num)
     {
        $bCheck = True;


        $highestIntegralSquareRoot = floor(sqrt($num));
        for ($i = 2; $i <= $highestIntegralSquareRoot; $i++)
        {
            if ($num % $i == 0) 
            {
                 $bCheck = False;
                 break;
            }               
        }
       if $bCheck 
          echo 'Prime';           
       else
          echo 'NOT prime'; 
     }       
  }

 $x = new IsPrime();
 $x->check(97);

现在,在上面,如果我们检查97是否为素数(实际上是),那么循环不需要从2运行到97,而只需要运行2到9.(97的平方根是9.8488578018,小于或等于9的最大整数。同样,我们可以检查数字121(这不是素数,因为它可以被11整除)。限制将从2增加到11等等。等等。 实际上,我们需要通过附近较小的素数来检查数字的可分性,但这会更复杂。 希望这会有所帮助。

答案 5 :(得分:0)

整个程序正确。但只有您应该使用 exit 函数替换 break ,因为break仅用于退出用花括号{}括起来的循环,而exit用于停止执行整个脚本。

class IsPrime
{   
    function check($num)
    {
        for ($i = 2; $i < $num; $i++)
        {
            if ($num % $i == 0) 
            {
                echo 'NOT prime';
                break;
            }               
        }
        echo 'Prime';           
    }       
}

$x = new IsPrime();
$x->check(4);

答案 6 :(得分:0)

休息只会打破for循环, 请改用return;。它将退出函数

答案 7 :(得分:0)

首先,请不要在这里犯错误:

df['new builds'].astype(str).astype(int)

然后:

number_of_columns = len(data.columns)
number_of_rows = data.shape[0]

for i in range(0, len(keyword_list)):
    column_loop = i + 1
    type(column_loop)
    for x in range(number_of_rows):
        row_loop = x + 1
        type(row_loop)
        sheet.update_cell(column_loop, row_loop, data.loc[x,keyword_list[i]])

2%2等于0,然后2表示为非素数。

接下来,您不必检查偶数,因此在检查$ num == 2之后,性能会更好:

for ($i = 2; $i < $num; $i++)

注意$ num / 2-您不必进行检查。 甚至更好的是:

if ($num % $i == 0) return false;

这是因为当您用2和3进行除法运算时,所有其他NON素数都是两个(或更多)素数的乘积(例如49 = 7 * 7或55 = 5 * 11)。在最坏的情况下,您的$ i指针将达到$ num的平方根(例如49 = 7 * 7)。这就是为什么要检查直到$ i * $ i <= $ num。

答案 8 :(得分:0)

我做了一个类似的例子,用户输入数字,然后PHP检查数字是否为质数。

HTML

<p>See if your number is a prime number</p>

<form>

<input type='number' name='number'>

<input type='submit' value='Check!'>

</form>

PHP

if ($_GET) {

    $i = 2;

    $isPrime = true;

    while ($i < $_GET['number']) {

        if ($_GET['number'] % $i == 0){

            // Number is NOT prime
            $isPrime = false;

        }

        $i++;
    }

    if ($isPrime){

        echo '<p>'.$i.' is a prime number!';

    } else {

        echo '<p>'.$i.' is NOT a prime number';

    }

}

希望这对您有用。

答案 9 :(得分:0)

<?php
function primeCheck($num)
{
    if ($num == 1)
        return false;
        for ($i = 2; $i <= $num/2; $i++)
        {
            if ($num % $i == 0)
            {
                return false;
            }
        }
    return true;
}

$primeNumber = primeCheck(17);

if ($primeNumber == true)
{
    echo "Is Prime";
}
else
{
    echo "Is Not Prime";
}
?>

答案 10 :(得分:0)

function is_prime($number)
{
    return (bool) !preg_match('/^1?$|^(11+?)\1+$/x', str_repeat('1', $number));
}

答案 11 :(得分:0)

$num = ceil(sqrt($num));

$is_prime = true;
for($j=3; $j<=$num; $j=$j+2){
    if($i%$j == 0){         
        $is_prime = false;
        break;
    }
}

if($is_prime){
    echo "No is Prime";
}

注意:从2开始循环,因为它是唯一的偶数素数。增加2,因为没有甚至没有是素数。

=&GT;查找范围内所有素数的代码(2-100)

$limit = 100; $arr = array(2);
for($i=3; $i<=$limit; $i=$i+2){

    $num = ceil(sqrt($i));

    $is_prime = true;
    for($j=3; $j<=$num; $j=$j+2){
        if($i%$j == 0){         
            $is_prime = false;
            break;
        }
    }

    if($is_prime){
        $arr[] = $i;
    }
}

答案 12 :(得分:0)

您可以打印“Prime”作为函数的返回,以确保在函数期间不会打印任何内容,除了“NOT prime”的条件。

   class IsPrime
    {       
        function check($num)
        {
            for ($i = 2; $i < $num; $i++)
            {
                if ($num % $i == 0) 
                {
                    echo 'NOT prime';
                    break;
                }               
            }
          return "Prime";         
        }       
    }

    $x = new IsPrime();
    echo $x->check(4);

答案 13 :(得分:0)

放入其他部分,否则它将始终return Prime

    for ($i = 2; $i < $num; $i++)
{
    if ($num % $i == 0)
    {
        echo 'NOT prime';
        break;
    }
    echo 'Prime';
}

答案 14 :(得分:0)

试试这个

<Button x:Name="SearchButton"
        Clicked="SearchButton_OnClicked"/>

答案 15 :(得分:0)

请检查

class IsPrime
{       
function check($num)
{
    for ($i = 2; $i < $num; $i++)
    {
        if ($num % $i == 0) 
        {
            echo 'NOT prime';
            break;
        }
        else
        {
            echo 'Prime';
        }
    }
    //echo 'Prime';           
}       
}
  $x = new IsPrime();
  $x->check(3);

答案 16 :(得分:0)

只需使用return:
class IsPrime
{       
function check($num)
{
    for ($i = 2; $i < $num; $i++)
    {
        if ($num % $i == 0) 
        {
            echo 'NOT prime';
            return; // that you need
        }               
    }
    echo 'Prime';           
}       
}

$x = new IsPrime();
$x->check(4);

if/else notation
 return notation

答案 17 :(得分:-2)

这是我的解决方案。如果你把条件放在循环中并在它之后中断,它就永远不会完成检查。

$num = rand ( 1, 1000 );

$notPri = null;

for($check = 2; $check < $num; $check ++) {

      if ($num % $check == 0) {
          $notPri ++;
         }
       }

if ($neEpri == 0) {

    echo $num . "<br>Prime!";

} else {
     echo $num . "<br>Not a prime!";
   }