算法

来源:互联网 发布:单片机模块化编程教程 编辑:程序博客网 时间:2024/06/05 17:10

1.判断一个数是否为素数(质数)

<?phpfunction get_prime($num){  if($num<=1){    return false;  }  $sq = intval(sqrt($num));  for ($i=2; $i <= $sq; $i++) {    if(($num % $i) == 0 ){      break;    }  }  if($i > $sq){    echo $num.'是素数';  }else{    echo $num.'不是素数';  }}get_prime(10);

2.获取n以内的所有素数(质数)

<?phpfunction get_primes($n){  if($n <= 1){    return false;  }  $primes = array(2);  for($i = 3; $i <= $n; $i += 2){    $sq = intval(sqrt($i));    for($j = 3; $j <= $sq; $j += 2){      if(($i % $j) == 0){        break;      }    }    if($j > $sq){      array_push($primes, $i);    }  }  return $primes;}print_r(get_primes(27));

3.石头剪刀布判断

  • 当两个数相等时为平局
  • 当p2加一除以3的余数等于p1,则p2获胜
<?php//0 石头 1剪刀 2布function fingerGuess($p1, $p2){  if($p1 == $p2){    echo 'draw';  }else if($p1 == ($p2+1)%3){    echo 'p2 win!';  }else{    echo 'p1 win!';  }}fingerGuess(0,2);

4.约瑟夫环

一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数, 再数到第m只,在把它踢出去…,如此不停的进行下去, 直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号

<?php/** * 获取猴王 * @param  int $n * @param  int $m  * @return int */function get_king_mokey($n, $m) {  $arr = range(1, $n);  $i = 0;  while (count($arr) > 1) {    $i++;    $tmp = array_shift($arr);    if($i % $m != 0){      array_push($arr, $tmp);    }  }  return $arr[0];}

5.顺序查找(哨兵)

<?php/** * 不使用哨兵顺序查找 * @param  array $arr   数组 * @param int $res    目的数字 * @return int        返回数字 */function search($arr, $res){  for ($i=0; $i < count($arr); $i++) {      if($arr[$i] == $res){        return $i;      }  }  return 0;}$arr  = array(2, 23, 44, 231, 2315, 21);if(search($arr, 23) > 0 ){    echo  "found!";}else{    echo  "not found!";}echo "<br>";/** * 使用哨兵顺序查找 * @param  array $arr   数组 * @param int $res    目的数字 * @return int        返回数字 */function search_sentry($arr, $res) {  // 哨兵  $arr[count($arr)] = $res;  $i = 0;  while ($arr[$i] != $res) {    $i++;  }  return $i;}$arr  = array(2, 23, 44, 231, 2315, 21);if(search_sentry($arr, 24) == count($arr)){    echo "not found!";}else{    echo  "found!";}

5.冒泡排序

<?php/** * 冒泡排序1 * @param  array $arr 需要排序的数组 * @return array      排序好的数组 */function bubble_sort($arr) {  for ($i=1; $i < count($arr); $i++) {    for ($j=0; $j < count($arr) - $i; $j++) {      if($arr[$j] > $arr[$j+1]){        $tmp = $arr[$j];        $arr[$j] = $arr[$j+1];        $arr[$j+1] = $tmp;      }    }  }  return $arr;}$arr = array(3, 4, 65, 312, 23);var_dump(bubble_sort($arr));/** * 冒泡排序2 * @param  array $arr 需要排序的数组 * @return array      排序好的数组 */function bubble2_sort($arr2){  for ($i = count($arr2)-1; $i > 0 ; $i--) {    for ($j=0; $j < $i; $j++) {      if($arr[$j] > $arr[$j+1]){        $tmp = $arr[$j];        $arr[$j] = $arr[$j+1];        $arr[$j+1] = $tmp;      }    }  }}$arr = array(3, 4, 65, 44, 23, 1, 15);var_dump(bubble_sort($arr));

6.一个数组里最小的1000个数

思路:假设最前面的1000个数为最小的,算出这1000个数中最大的数,然后和第1001个数比较,如果这最大的数比这第1001个数小的话跳过,如果要比这第1001个数大则将两个数交换位置,并算出新的1000个数里面的最大数,再和下一个数比较,以此类推。

<?php/** * 获取最小的k个数 * @param  array $arr   整个数组 * @param  int $k       指定的k位 * @return array        最小的k个数的数组  */function get_min_array($arr, $k) {  $n = count($arr);  $min_array = array();  for ($i=0; $i < $n; $i++) {    if($i < $k){      $min_array[$i] = $arr[$i];    }else{      if($i == $k){        $max_pos = get_max_pos($min_array);        $max = $min_array[$max_pos];      }      if($arr[$i] < $max){        $min_array[$max_pos] = $arr[$i];        $max_pos = get_max_pos($min_array);        $max = $min_array[$max_pos];      }    }  }  return $min_array;}/** * 获取数组中最大值的下标 * @param  array $arr   数组 * @return int          最大值下标 */function get_max_pos($arr){  $pos = 0;  for ($i=1; $i < count($arr); $i++) {    if($arr[$i] > $arr[$pos]){      $pos = $i;    }  }  return $pos;}$arr = array(3, 5, 2, 23, 1, 15, 2, 16, 4);var_dump(get_min_array($arr, 5));

7.打乱数组

php自带的打乱数组函数:shuffle()

<?php/** * 打乱数组 * @param  array       数组 * @return array      打乱的数组 */function diy_shuffle($arr) {  $n = count($arr);  for ($i=0; $i < $n; $i++) {    $rand_pos = mt_rand(0, $n-1);    if($i != $rand_pos){      $tmp = $arr[$i];      $arr[$i] = $arr[$rand_pos];      $arr[$rand_pos] = $tmp;    }  }  return $arr;}$arr = array(1, 2, 3, 4, 5);var_dump(diy_shuffle($arr));

8.两个有序int集合是否有相同元素的最优算法

<?php/** * 有序int数组的相同元素 * @param  array $arr1 数组1 * @param  array $arr2 数组2 * @return array       相同元素数组 */function find_array($arr1, $arr2) {  $i = $j = 0;  $common_array = array();  while($i < count($arr1) && $j < count($arr2)){    if($arr1[$i] < $arr2[$j]){      $i++;    }else if($arr1[$i] > $arr2[$j]){      $j++;    }else{      $common_array[] = $arr1[$i];      $i++;      $j++;    }  }  return $common_array;}$arr1 = array(1, 4, 5, 7, 9, 14, 17);$arr2 = array(2, 3, 5, 7, 8, 9, 14);var_dump(find_array($arr1, $arr2));
原创粉丝点击