约瑟夫环问题的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迅雷、快车、旋风下载专用链转换代码
Jun 15 PHP
php的数组与字符串的转换函数整理汇总
Jul 18 PHP
php获取域名的google收录示例
Mar 24 PHP
PHP图片等比例缩放生成缩略图函数分享
Jun 10 PHP
PHP根据传来的16进制颜色代码自动改变背景颜色
Jun 13 PHP
PHP实现定时执行任务的方法
Oct 05 PHP
PHP实现合并discuz用户
Aug 05 PHP
YiiFramework入门知识点总结(图文教程)
Dec 28 PHP
thinkphp3.x中display方法及show方法的用法实例
May 19 PHP
CodeIgniter整合Smarty的方法详解
Aug 25 PHP
PHP 进度条函数的简单实例
Sep 19 PHP
YII框架页面缓存操作示例
Apr 29 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
ftp类(example.php)
2006/10/09 PHP
PHP中echo和print的区别
2014/08/28 PHP
PHP加密解密类实例代码
2016/07/20 PHP
thinkPHP多表查询及分页功能实现方法示例
2017/07/03 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
2020/08/17 PHP
用tip解决Ext列宽度不够的问题
2008/12/13 Javascript
仿新浪微博登陆邮箱提示效果的js代码
2013/08/02 Javascript
JS操作JSON要领详细总结
2013/08/25 Javascript
js 处理数组重复元素示例代码
2013/12/27 Javascript
jquery实现的下拉和收缩效果示例
2014/08/21 Javascript
JavaScript 性能优化小结
2015/10/12 Javascript
jQuery实用技巧必备(下)
2015/11/03 Javascript
win7下安装配置node.js+express开发环境
2015/12/06 Javascript
Express的路由详解
2015/12/10 Javascript
详解javascript传统方法实现异步校验
2016/01/22 Javascript
vue组件中使用iframe元素的示例代码
2017/12/13 Javascript
jQuery 改变P标签文本值方法
2018/02/24 jQuery
koa上传excel文件并解析的实现方法
2018/08/09 Javascript
Vuex的基本概念、项目搭建以及入坑点
2018/11/04 Javascript
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
详解微信小程序(Taro)手动埋点和自动埋点的实现
2021/03/02 Javascript
Python重新引入被覆盖的自带function
2014/07/16 Python
对于Python编程中一些重用与缩减的建议
2015/04/14 Python
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
2015/05/02 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
2018/11/16 Python
python调用java的jar包方法
2018/12/15 Python
基于python实现计算且附带进度条代码实例
2020/03/31 Python
win10从零安装配置pytorch全过程图文详解
2020/05/08 Python
520使用Python实现“我爱你”表白
2020/05/20 Python
Aosom西班牙:家具在线商店
2020/06/11 全球购物
大学生职业生涯规划范文
2014/01/22 职场文书
本科毕业生求职自荐信
2014/02/03 职场文书
2014年小班元旦活动方案
2014/02/16 职场文书
2016年师德学习心得体会
2016/01/12 职场文书
《少年闰土》教学反思
2016/02/18 职场文书
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL