约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数


Posted in PHP onOctober 12, 2010

来看看这个问题的详细描述:
view sourceprint?一群猴子排成一圈,按 1,2,...,n 依次编号。然后从第 1 只开始数,数到第 m 只,把它踢出圈,从它后面再开始数, 再数到第 m 只,在把它踢出去...,如此不停的进行下去, 直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入 m、n, 输出最后那个大王的编号。
刚开始构思的时候想使用 PHP 数组来实现(当然最后还是使用的数组),然后模拟一个数组的内部指针,结果发现想模拟一个“数组指针”不是那么的容易,因为涉及到很多“指针”的操作,最后猛然想到,PHP 的数组本身就是有内部指针的,为什么还要去“造车轮子”呢?!于是乎~看代码:

function getKingMonkey($n, $m) 
{ 
$a = array();//声明内部数组 
for($i = 1; $i <= $n; $i ++) 
{ 
$a[$i] = $i;//这一步是对号入座 
} 
reset($a);//为了严谨,我们来一个 reset() 函数,其实也可以省去 
while(count($a) > 1)//主循环开始,这里使用的判别条件是数组元素的个数等于 1 的时候停止循环 
{ 
for($counter = 1; $counter <= $m; $counter++)//嵌套的 for 循环,用来“踢出”数到 m 的猴子 
{ 
if(next($a)){//如果存在 next 元素 
if($counter == $m) 
{ 
unset($a[array_search(prev($a), $a)]);//当数到 m 时,使用 unset() 删除数组元素 
} 
} 
else//如果不存在 next 元素 
{ 
reset($a);//则数组的第一个元素充当 next 元素 
if($counter == $m) 
{ 
unset($a[array_search(end($a), $a)]);//当数到 m 时,使用 unset() 删除数组元素,注意这里是 end() 
reset($a);//记得让数组内部指针“归位” 
} 
} 
} 
} 
return current($a); 
}

测试一下下:
echo "猴子大王的编号为:" . getKingMonkey(100, 17);
输出为:
view sourceprint?猴子大王的编号为:53
The End~
PHP 相关文章推荐
PHP 采集程序 常用函数
Dec 18 PHP
PHP中strlen()和mb_strlen()的区别浅析
Jun 19 PHP
PHP中比较时间大小实例
Aug 21 PHP
自己写的兼容低于PHP 5.5版本的array_column()函数
Oct 24 PHP
PHP类的封装与继承详解
Sep 29 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
Jan 11 PHP
php 使用curl模拟ip和来源进行访问的实现方法
May 02 PHP
如何利用预加载优化Laravel Model查询详解
Aug 11 PHP
深入理解 PHP7 中全新的 zval 容器和引用计数机制
Oct 15 PHP
TP5框架实现签到功能的方法分析
Apr 05 PHP
使用Rancher在K8S上部署高性能PHP应用程序的教程
Jul 10 PHP
phpquery中文手册
Mar 18 PHP
使用PHP 5.0创建图形的巧妙方法
Oct 12 #PHP
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
Oct 12 #PHP
献给php初学者(入门学习经验谈)
Oct 12 #PHP
发款php蜘蛛统计插件只要有mysql就可用
Oct 12 #PHP
php更改目录及子目录下所有的文件后缀扩展名的代码
Oct 12 #PHP
利用php+mysql来做一个功能强大的在线计算器
Oct 12 #PHP
发一个php简单的伪原创程序,配合商城采集用的
Oct 12 #PHP
You might like
Discuz批量替换帖子内容的方法(使用SQL更新数据库)
2014/06/23 PHP
PHP把数字转成人民币大写的函数分享
2014/06/30 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
一个可绑定数据源的jQuery数据表格插件
2010/07/17 Javascript
javascript静态页面传值的三种方法分享
2013/11/12 Javascript
JS调试必备的5个debug技巧
2014/03/07 Javascript
js中的如何定位固定层的位置
2014/06/15 Javascript
Javascript实现获取窗口的大小和位置代码分享
2014/12/04 Javascript
javascript获取四位数字或者字母的随机数
2015/01/09 Javascript
JavaScript中property和attribute的区别详细介绍
2015/03/03 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
jQuery移动页面开发中的触摸事件与虚拟鼠标事件简介
2015/12/03 Javascript
关于layui的下拉搜索框异步加载数据的解决方法
2019/09/28 Javascript
highcharts.js数据绑定方式代码实例
2019/11/13 Javascript
Vue 解决父组件跳转子路由后当前导航active样式消失问题
2020/07/21 Javascript
封装Vue Element的table表格组件的示例详解
2020/08/19 Javascript
如何在vue中使用HTML 5 拖放API
2021/01/14 Vue.js
[02:30]DOTA2放量测试专访海涛:呼吁保护新手玩家
2013/08/26 DOTA
[40:03]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#1EHOME VS Archon
2016/03/02 DOTA
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
[45:52]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第二场 12.09
2020/12/12 DOTA
基于python实现微信模板消息
2015/12/21 Python
python 阶乘累加和的实例
2019/02/01 Python
python中嵌套函数的实操步骤
2019/02/27 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
2019/12/06 Python
对python中return与yield的区别详解
2020/03/12 Python
Django扫码抽奖平台的配置过程详解
2021/01/14 Python
用CSS3实现背景渐变的方法
2015/07/14 HTML / CSS
将"引用"作为函数返回值类型的格式、好处和需要遵守的规则
2016/02/09 面试题
感恩之星事迹材料
2014/05/03 职场文书
2014年城市管理工作总结
2014/12/02 职场文书
2015年手术室工作总结
2015/05/11 职场文书
2015年社区国庆节活动总结
2015/07/30 职场文书
安全教育主题班会总结
2015/08/14 职场文书
优秀党员主要事迹材料
2015/11/04 职场文书