2012-12-26 37 views
0

我需要查找给定范围内的最高质数。
这里是我的代码,适用于0-100但如果我给0-125它显示为125查找给定范围内的最高质数

<?php 
    $flag=0; 
    $b=125; 
    for($i=$b;$i>=0;$i--) 
    { 
     if($i%2!=0) 
     { 
      for($b=3;$b<10;$b++) 
      { 
       if($flag==0) 
       { 
        echo('<br>'); 
        if($i%$b!=0) 
        { 
         echo('highest prime number is'.$i); 
         $flag=1; 
         break; 
        } 
        elseif ($i%$b==0) 
        { 
         break; 
        } 
       } 
      } 
     } 
    } 
?> 

在上面的代码中,我已经采取了一系列从0-125

+0

为什么$ b是3-> 10?它应该是2-> sqrt(结束) –

+0

什么是特殊的i%2?素数N是任何质数小于sqrt(N)的数,可以放置在下列句子中:N%K!= 0; –

回答

0

烨问题是算法...

1)你需要检查截至sqrt($b)即11在这种情况下

2)$flag逻辑是有点儿弄乱,没有用改变标志然后打破后右...

<?php 
     $flag=0; 
     $b=125; 
     $sq=sqrt($b); 

     for($i=$b;$i>=0;$i--) 
     { 

      if($i%2!=0) 
      { 
        for($b=3;$b<=$sq;$b++) 
        { 
          if($i%$b!=0) 
          { 
           $flag=1; 
          } 
          elseif($i%$b==0) 
          { 
           $flag=0; 
           break; 
          } 
        } 
      if($flag==1){ 
       echo('highest prime number is '.$i); 
       break; 
      } 
     } 
    } 
?> 
5
质数

gmp_nextprime()

<?php 
$start = 125; 
$stop = 0; 
for($x=$start;$x>=$stop;$x--){ 
    if(($prime = gmp_intval(gmp_nextprime($x)))<$start){ 
     echo 'The highest prime is '.$prime; 
     break; 
    } 
}?> 
+0

感谢您的回复塞缪尔库克..但我需要不使用'gmp_nextprime()'函数.. iamgetting消息'调用未定义的函数gmp_intval()在C:\ wamp \ www \ highprime.php上线5' – Friend

+4

懒学生检测到 –

+0

eicto ru叫我懒惰?如果IAM懒惰我会一直没有尝试.... IAM尝试自早晨..但没有得到... – Friend

1

thanks for your reply Samuel Cook ..but i need without using 'gmp_nextprime()' function.. iamgetting message 'Call to undefined function gmp_intval() in C:\wamp\www\highprime.php on line 5' – user1659450 16 mins ago

由于您正在努力使gmp functions工作,那么您可以使用

例1:无GMP功能

$range = range(125, 0); // create the range 
foreach ($range as $v) { 
    if (isPrime($v)) { 
     printf('highest prime number is %d', $v); 
     break; 
    } 
} 

如果你能得到GMP再工作,就可以使用gmp_prob_prime 功能用于

示例1:使用GMP功能

foreach ($range as $v) { 
    if (gmp_prob_prime($v) == 2) { 
     printf('highest prime number is %d', $v); 
     break; 
    } 
} 

输出

highest prime number is 113 

函数使用

function isPrime($num) { 
    if ($num == 1) 
     return false; 

    if ($num == 2) 
     return true; 

    if ($num % 2 == 0) { 
     return false; 
    } 

    for($i = 3; $i <= ceil(sqrt($num)); $i = $i + 2) { 
     if ($num % $i == 0) 
      return false; 
    } 
    return true; 
} 
+0

'if($ num == 2)'不需要:) –

+0

如果不是'var_dump($ num%2 == 0);'是'true'就需要它,返回'2'作为'无效的素数'..而不是'有效素数' – Baba

+0

啊好的2是素数:) –

0

可以使用被划分数从3开始与由2填充的阵列的最简单的方法中,如果弹性模量(%)给你一个大于0,否则,一个答案,这是最重要的。 然后,你有一个工作代码后,我觉得我可以做得更好?

  • 你可以说我想忽略偶数!所以为什么迭代比完成呢?只需使用i = i + 2(并以3作为种子素数开始)
  • 我划分的数字太多!你真的需要检查21%11,21%13,21%17,21%19吗?他们总是小于2,所以让我们忽略素数>一半
  • 优化更多?如何限制在代码中使用根作为最大值会影响它?为什么?
  • 更多?为什么我不能预先消除所有非素数并检查剩下的部分?

尝试将这些应用于您的代码或仅适用于Google的工作版本。