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 相关文章推荐
用PHP和ACCESS写聊天室(三)
Oct 09 PHP
PHP 处理TXT文件(打开/关闭/检查/读取)
May 13 PHP
ThinkPHP CURD方法之field方法详解
Jun 18 PHP
PHP缓存集成库phpFastCache用法
Dec 15 PHP
php通过sort()函数给数组排序的方法
Mar 18 PHP
浅谈php中include文件变量作用域
Jun 18 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
Aug 08 PHP
优化WordPress中文章与评论的时间显示
Jan 12 PHP
PHP处理二进制数据的实现方法
Jun 13 PHP
php fread读取文件注意事项
Sep 24 PHP
PHP实现Google plus的好友拖拽分组效果
Oct 21 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
Dec 25 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&amp;&amp;mysql)六
2006/10/09 PHP
PHP hex2bin()函数用法讲解
2019/02/25 PHP
JavaScript中的prototype使用说明
2010/04/13 Javascript
使用jquery实现div的tab切换实例代码
2013/05/27 Javascript
nodejs中实现路由功能
2014/12/29 NodeJs
jQuery实现hover合成事件的方法
2015/08/06 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
2016/01/19 Javascript
属于你的jQuery提示框(Tip)插件
2016/01/20 Javascript
详解javascript获取url信息的常见方法
2016/12/19 Javascript
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
Vue.js 2.0和Cordova开发webApp环境搭建方法
2018/02/26 Javascript
快速解决vue-cli不能初始化webpack模板的问题
2018/03/20 Javascript
vue配置请求本地json数据的方法
2018/04/11 Javascript
微信小程序select下拉框实现效果
2019/05/15 Javascript
通过Nodejs搭建网站简单实现注册登录流程
2019/06/14 NodeJs
vue-router路由模式详解(小结)
2019/08/26 Javascript
Python的MongoDB模块PyMongo操作方法集锦
2016/01/05 Python
使用Python的networkx绘制精美网络图教程
2019/11/21 Python
django 外键创建注意事项说明
2020/05/20 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
2020/06/30 Python
用python对excel查重
2020/12/07 Python
css3背景_动力节点Java学院整理
2017/07/11 HTML / CSS
苹果音乐订阅:Apple Music
2018/08/02 全球购物
三陽商会官方网站:Sanyo iStore
2019/05/15 全球购物
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
StringBuilder和String的区别
2015/05/18 面试题
我未来的职业规划范文
2014/01/11 职场文书
保安部任务及岗位职责
2014/02/25 职场文书
医学生职业生涯规划书范文
2014/03/13 职场文书
老干部工作先进事迹
2014/08/17 职场文书
2016年共产党员公开承诺书
2016/03/24 职场文书
nginx配置proxy_pass中url末尾带/与不带/的区别详解
2021/03/31 Servers
基于go interface{}==nil 的几种坑及原理分析
2021/04/24 Golang
解决pytorch读取自制数据集出现过的问题
2021/05/31 Python
详解Redis的三种常用的缓存读写策略步骤
2022/05/06 Redis
Nginx如何配置多个服务域名解析共用80端口详解
2022/09/23 Servers