约瑟夫环问题的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新手上路(六)
Oct 09 PHP
PHP date函数参数详解
Nov 27 PHP
php模拟socket一次连接,多次发送数据的实现代码
Jul 26 PHP
php unset全局变量运用问题的深入解析
Jun 17 PHP
PHP设置图片文件上传大小的具体实现方法
Oct 11 PHP
理解PHP中的Session及对Session有效期的控制
Jan 08 PHP
PHP中文字符串截断无乱码解决方法
Oct 10 PHP
如何使用PHP给图片加水印
Oct 12 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
Nov 14 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
Feb 06 PHP
PHP后期静态绑定实例浅析
Dec 21 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
php读取文件内容的三种可行方法示例介绍
2014/02/08 PHP
PHP实现动态执行代码的方法
2016/03/25 PHP
jQuery插件原来如此简单 jQuery插件的机制及实战
2012/02/07 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
使用js判断控件是否获得焦点
2014/01/03 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
全面兼容的javascript时间格式化函数(比较实用)
2014/05/14 Javascript
javascript根据时间生成m位随机数最大13位
2014/10/30 Javascript
JavaScript使用pop方法移除数组最后一个元素用法实例
2015/04/06 Javascript
js实现点击切换TAB标签实例
2015/08/21 Javascript
JS弹出窗口插件zDialog简单用法示例
2016/06/12 Javascript
使用JavaScript判断手机浏览器是横屏还是竖屏问题
2016/08/02 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
2016/09/23 Javascript
微信小程序 获取相册照片实例详解
2016/11/16 Javascript
canvas实现动态小球重叠效果
2017/02/06 Javascript
JavaScript实现修改伪类样式
2017/11/27 Javascript
NodeJS简单实现WebSocket功能示例
2018/02/10 NodeJs
vue 组件中slot插口的具体用法
2018/04/03 Javascript
vue-next/runtime-core 源码阅读指南详解
2019/10/25 Javascript
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
2020/02/15 Javascript
实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
2016/01/20 Python
TensorFlow的权值更新方法
2018/06/14 Python
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
python或C++读取指定文件夹下的所有图片
2019/08/31 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
Python根据指定文件生成XML的方法
2020/06/29 Python
详解pycharm自动import所需的库的操作方法
2020/11/30 Python
洛佩桑酒店官方网站:Lopesan Hotels
2019/04/15 全球购物
爱尔兰最大的体育零售商:Life Style Sports
2019/06/12 全球购物
世界上最大的铁人三项商店:Tri UK
2020/11/04 全球购物
如何反序的迭代一个序列?how do I iterate over a sequence in reverse order
2012/02/04 面试题
学生的自我鉴定范文
2013/10/24 职场文书
闭幕式主持词
2014/04/02 职场文书
小学庆六一主持词
2015/06/30 职场文书
2016大学优秀学生干部事迹材料
2016/03/01 职场文书
nginx基于域名,端口,不同IP的虚拟主机设置的实现
2021/03/31 Servers