php实现猴子选大王问题算法实例


Posted in PHP onApril 20, 2015

本文实例讲述了php实现猴子选大王问题算法。分享给大家供大家参考。具体分析如下:

一、问题:

n只猴子围坐成一个圈,按顺时针方向从1到n编号。
然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,
如此重复,直至剩下一个猴子,它就是大王。

设计并编写程序,实现如下功能:
(1)   要求由用户输入开始时的猴子数$n、报数的最后一个数$m。
(2)   给出当选猴王的初始编号。

二、解决方法:

/**
 * @param int $n 开始时的猴子数量
 * @param int $m 报道的最后一个数
 *(报到这个数的猴子被淘汰,然后下一个猴子重新从①开始报数) 
 * @return int 猴子的初始编号 
 */
function monkeySelectKing($n,$m)
{
 //猴子的初始数量不能小于2
 if ($n<2)
 {
 return false;
 }
 
 $arr=range(1,$n);
 //将猴子分到一个数组里, 数组的值对应猴子的初始编号
 $unsetNum=0;
 //定义一个变量,记录猴子的报数
 
 for ($i = 2; $i <=$n*$m ; $i++)
 //总的循环次数不知道怎么计算,
 {
 //不过因为循环中设置了return,所以$m*$len效率还可以
 foreach ($arr as $k => $v)
 {
  $unsetNum++; //每到一个猴子, 猴子报数+1
 
 //当猴子的报数等于淘汰的数字时:淘汰猴子(删除数组元素)
 //报数归0(下一个猴子从1开始数)
  if ($unsetNum==$m) 
  {
//  echo "<pre>";//打开注释,可以看到具体的淘汰过程
//  print_r($arr);
  unset($arr[$k]);
 //淘汰猴子  
  $unsetNum=0;
 //报数归零
  if (count($arr)==1)
 //判断数组的长度, 如果只剩一个猴子, 返回它的值
  {
   return reset($arr);
  }
  }
 }
 }
}
 
var_dump(monkeySelectKing(6, 3));

补充改进算法(该算法更加简洁明了!):

function yuesefu($n,$m) { 
  $r=0; 
  for($i=2; $i<=$n; $i++) {

      $r=($r+$m)%$i; 
  }
  return $r+1; 
} 
print_r(yuesefu(3,3));

希望本文所述对大家的php程序算法设计有所帮助。

PHP 相关文章推荐
我的群发邮件程序
Oct 09 PHP
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
Apr 18 PHP
php 攻击方法之谈php+mysql注射语句构造
Oct 30 PHP
PHP XML数据解析代码
May 26 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
Dec 05 PHP
php使用iconv中文截断问题的解决方法
Feb 11 PHP
wampserver改变默认网站目录的办法
Aug 05 PHP
PHP类的声明与实例化及构造方法与析构方法详解
Jan 26 PHP
php表单习惯用的正则表达式
Oct 11 PHP
php读取本地json文件的实例
Mar 07 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
Dec 18 PHP
PHP开发api接口安全验证操作实例详解
Mar 26 PHP
php递归删除指定文件夹的方法小结
Apr 20 #PHP
php动态生成缩略图并输出显示的方法
Apr 20 #PHP
PHP随机生成唯一HASH值自定义函数
Apr 20 #PHP
php隐藏实际地址的文件下载方法
Apr 18 #PHP
php实现用于计算执行时间的类实例
Apr 18 #PHP
php递归遍历多维数组的方法
Apr 18 #PHP
php实现二进制和文本相互转换的方法
Apr 18 #PHP
You might like
PHP添加PNG图片背景透明水印操作类定义与用法示例
2019/03/12 PHP
Jquery.TreeView结合ASP.Net和数据库生成菜单导航条
2010/08/27 Javascript
jquery下动态显示jqGrid以及jqGrid的属性设置容易出现问题的解决方法
2010/10/22 Javascript
Javascript实现滑块滑动改变值的实现代码
2013/04/12 Javascript
javascript实现的HashMap类代码
2014/06/27 Javascript
手机号码,密码正则验证
2014/09/04 Javascript
简单方法判断JavaScript对象为null或者属性为空
2014/09/26 Javascript
适用于javascript开发者的Processing.js入门教程
2016/02/24 Javascript
HTML5 js实现拖拉上传文件功能
2020/11/20 Javascript
常用的js方法合集
2017/03/10 Javascript
zTree实现节点修改的实时刷新功能
2017/03/20 Javascript
jQuery插件FusionWidgets实现的Bulb图效果示例【附demo源码下载】
2017/03/23 jQuery
详解Webpack多环境代码打包的方法
2018/08/03 Javascript
javascript局部自定义鼠标右键菜单
2020/12/08 Javascript
[01:20:47]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第一场 1月19日
2021/03/11 DOTA
Python中动态检测编码chardet的使用教程
2017/07/06 Python
理论讲解python多进程并发编程
2018/02/09 Python
Django CBV与FBV原理及实例详解
2019/08/12 Python
使用IPython或Spyder将省略号表示的内容完整输出
2020/04/20 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
CSS3的RGBA中关于整数和百分比值的转换
2015/08/04 HTML / CSS
详解Html5 Canvas画线有毛边解决方法
2018/03/01 HTML / CSS
html5指南-4.使用Geolocation实现定位功能
2013/01/07 HTML / CSS
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
详解如何将 Canvas 绘制过程转为视频
2021/01/25 HTML / CSS
联想台湾官网:Lenovo TW
2018/05/09 全球购物
联强国际笔试题面试题
2013/07/10 面试题
统计每一学生的平均成绩
2014/06/06 面试题
如何进行Linux分区优化
2013/02/12 面试题
设置器与访问器的定义以及各自特点
2016/01/08 面试题
劳动竞赛活动总结
2014/05/05 职场文书
小石潭记导游词
2015/02/03 职场文书
滴水洞导游词
2015/02/10 职场文书
2015年网络管理员工作总结
2015/05/21 职场文书
JavaScript实现复选框全选功能
2021/04/11 Javascript
Oracle数据库中通用的函数实例详解
2022/03/25 Oracle