PHP,生成素数,什么';这是不对的

PHP,生成素数,什么';这是不对的,php,Php,这个怎么了?条件语句看起来足够可靠,但包含了所有数字 function generate_primes(){ $max = 100; $primes = array(); for($current_pointer = 1; $current_pointer <= $max; $current_pointer++){ for($divider = 1; $divider <= $current_pointer; $divider++){

这个怎么了?条件语句看起来足够可靠,但包含了所有数字

function generate_primes(){
   $max = 100;
   $primes = array();

   for($current_pointer = 1; $current_pointer <= $max; $current_pointer++){

        for($divider = 1; $divider <= $current_pointer; $divider++){
        //if(in_array($divider, $primes)){
        if(($current_pointer % $divider === 0) && ($divider !== 1) && ($divider ===    $current_pointer)){
           $primes[] = $current_pointer;
           }
//}

        }

    }
print_r($primes);

}
generate_primes();
函数生成_素数(){
$max=100;
$primes=array();

对于($current\u pointer=1;$current\u pointer我认为您的最后一个条件应该是:

$divider !== $current_pointer

我认为你的最后一个条件应该是:

$divider !== $current_pointer

首先,你的循环有点滑稽;)如果你想排除1,不要从1开始


第二,我不理解你的条件句的最后一个句子。你是说如果除法器是==当前指针,你只会认为它是一个素数。我想你是指!= =当前指针。

首先,你的循环有点滑稽;如果你想排除1,不要从1

开始。

第二,我不理解你的条件句的最后一个子句。你是说如果除法器是==当前指针,你只会认为它是一个素数。我想你是指!=当前指针。< /P> < P>重新思考你的算法。质数是一个自然数>1,除本身和1。o、 如果

$current\u pointer%$divider===0
,则所讨论的数字不能是素数,因为它可以被
$divider
整除。那么为什么要将其添加到数组中

根据评论编辑:为了澄清,这意味着您必须检查所有可能的除数(从2到数字本身-1),并确保没有一个除数不带余数。在这种情况下,数字是素数


您可以稍微优化此算法(即,数字的根可以是内部循环的上限),但首先尝试在基本情况下工作。

重新思考您的算法。质数是一个自然数>1,它不能被除自身和1之外的任何其他自然数均匀整除。因此,如果
$current\u pointer%$divider==0
,则所讨论的数字不能是质数,因为它可以被
$divider整除。那么为什么要将其添加到阵列中

根据评论编辑:为了澄清,这意味着您必须检查所有可能的除数(从2到数字本身-1),并确保没有一个除数不带余数。在这种情况下,数字是素数


您可以稍微优化此算法(即,数字的根可以是内部循环的上限),但首先尝试在基本情况下工作。

您需要处理这样一种情况,即您的除法器确实等分到您的当前\u指针,但除法器不等于当前指针。在这种情况下,您需要跳出循环(即,您找到了等分的东西,因此数字不是素数).如前所述,所有循环最终都会遇到将数字除以自身的情况,因此所有数字都会成功

换句话说,您正在尝试测试第一个成功的除法器是否是数字本身,但要做到这一点,您必须在遇到另一个成功的除法器时停止尝试

    if(($current_pointer % $divider === 0) && ($divider !== 1)){
         if ($divider === $current_pointer)
            $primes[] = $current_pointer;
         } else {
            continue; // the continue makes you stop testing the current pointer and go on to the next
         }

您需要处理这样一种情况:您的除法器确实均匀地划分到您的当前_指针中,但除法器不等于当前指针。在这种情况下,您需要跳出循环(即,您发现一些东西均匀地划分,因此数字不是素数).如前所述,所有循环最终都会遇到将数字除以自身的情况,因此所有数字都会成功

换句话说,您正在尝试测试第一个成功的除法器是否是数字本身,但要做到这一点,您必须在遇到另一个成功的除法器时停止尝试

    if(($current_pointer % $divider === 0) && ($divider !== 1)){
         if ($divider === $current_pointer)
            $primes[] = $current_pointer;
         } else {
            continue; // the continue makes you stop testing the current pointer and go on to the next
         }
两个错误:1)
$divider===$current\u pointer)
应该是
$divider!=$current\u pointer)
和2)每次迭代后都要将数字添加到$primes数组中

建议:1)以2开始第二个循环,因为您希望$divider在第一个位置不是1,2)使$divider<$current\u指针(而不是两件错误的事情:1)
$divider===$current\u pointer)
应该是
$divider!=$current\u pointer)
并且2)在每次迭代之后,您都要将数字添加到$primes数组中


建议:1)以2开始第二个循环,因为您希望$divider在第一位不是1,2)使$divider<$current\u指针(而不是查看您的if语句。它本质上说:

在下列情况下,将数字标记为素数:

  • 当前_指针等于0
  • 除法器不等于0
  • 除法器等于当前指针
  • 只有当最后一个条件为真时(除法器等于当前_指针),这些条件中的3个才为真

    如果当前指针是6,那么当除法器等于6时,您将把它存储为素数(显然不是真的)

    将此示例视为测试数字是否为素数的一个简单(尽管实现成本高昂)函数(您可以轻松使用该逻辑生成生成器)。

    看看你的if语句。它本质上说:

    在下列情况下,将数字标记为素数:

  • 当前_指针等于0
  • 除法器不等于0
  • 除法器等于当前指针
  • 只有当最后一个条件为真时(除法器等于当前_指针),这些条件中的3个才为真

    如果当前指针是6,那么当除法器等于6时,您将把它存储为素数(显然不是真的)

    将此示例视为测试数字是否为素数的一个简单(尽管实现成本高昂)函数(您可以轻松使用该逻辑生成生成器)。
    问题是

    if( ($current_pointer % $divider === 0) && 
        ($divider !== 1) && 
        ($divider === $current_pointer)){
    
    $divider==$current\u指针

    一个更好的方法是使用
    is_prime
    标志initiated为true。如果有任何小于它的数字除以它,则将其设置为false

    进一步的增强是添加n