约瑟夫环问题的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 相关文章推荐
计数器详细设计
Oct 09 PHP
dedecms中显示数字验证码的修改方法
Mar 21 PHP
PHP正则的Unknown Modifier错误解决方法
Mar 02 PHP
rrmdir php中递归删除目录及目录下的文件
May 15 PHP
PHP中上传多个文件的表单设计例子
Nov 19 PHP
php中使用key,value,current,next和prev函数遍历数组的方法
Mar 17 PHP
PHP的AES加密算法完整实例
Jul 20 PHP
apache php mysql开发环境安装教程
Jul 28 PHP
PHP简单实现循环链表功能示例
Nov 10 PHP
PHP5.5新特性之yield理解与用法实例分析
Jan 11 PHP
Laravel框架创建路由的方法详解
Sep 04 PHP
php的RSA加密解密算法原理与用法分析
Jan 23 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实现二分查找算法代码分享
2011/06/24 PHP
PHP url 加密解密函数代码
2011/08/26 PHP
Symfony2中被遗弃的getRequest()方法分析
2016/03/17 PHP
PHP简单日历实现方法
2016/07/20 PHP
php 中phar包的使用教程详解
2018/10/26 PHP
使用laravel和ECharts实现折线图效果的例子
2019/10/09 PHP
JavaScript初学者需要了解10个小技巧
2010/08/25 Javascript
JS操作select下拉框动态变动(创建/删除/获取)
2013/06/02 Javascript
简单的邮箱登陆的提示效果类似于yahoo邮箱
2014/02/26 Javascript
node.js WEB开发中图片验证码的实现方法
2014/06/03 Javascript
jQuery类选择器用法实例
2014/12/23 Javascript
jQuery获取上传文件的名称的正则表达式
2015/05/21 Javascript
JS更改select内option属性的方法
2015/10/14 Javascript
jQuery输入框密码的显示隐藏【代码分享】
2017/04/29 jQuery
js时间戳与日期格式之间相互转换
2017/12/11 Javascript
vuejs前后端数据交互之从后端请求数据的实例
2018/08/11 Javascript
JQuery发送ajax请求时中文乱码问题解决
2019/11/14 jQuery
vue实例的选项总结
2020/06/09 Javascript
Python文本相似性计算之编辑距离详解
2016/11/28 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
Python模拟登录的多种方法(四种)
2018/06/01 Python
Python3中lambda表达式与函数式编程讲解
2019/01/14 Python
tensorflow使用range_input_producer多线程读取数据实例
2020/01/20 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
2020/03/13 Python
html5使用canvas压缩图片的示例代码
2018/09/11 HTML / CSS
深入了解canvas在移动端绘制模糊的问题解决
2019/04/30 HTML / CSS
在网上学习全世界最好的课程:Coursera
2017/11/07 全球购物
LN-CC美国:伦敦时尚生活的缩影
2019/02/19 全球购物
AJAX都有哪些有点和缺点
2012/11/03 面试题
安全承诺书范文
2014/03/26 职场文书
群众路线党课主持词
2014/04/01 职场文书
房产委托公证书
2014/04/08 职场文书
文秘自荐信
2014/06/28 职场文书
单位介绍信格式范文
2015/05/04 职场文书
宿舍管理制度范本
2015/08/07 职场文书
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis