约瑟夫环问题的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 27 PHP
PHP取整函数:ceil,floor,round,intval的区别详细解析
Aug 31 PHP
php header功能的使用
Oct 28 PHP
ThinkPHP登录功能的实现方法
Aug 20 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
Aug 21 PHP
ThinkPHP入口文件设置及相关注意事项分析
Dec 05 PHP
php语言的7种基本的排序方法
Dec 28 PHP
PHP 数组遍历foreach语法结构及实例
Jun 13 PHP
PHP+JQuery+Ajax实现分页方法详解
Aug 06 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
Sep 26 PHP
PHP  Yii清理缓存的实现方法
Nov 10 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
Mar 09 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脚本数据库功能详解(下)
2006/10/09 PHP
php smarty的预保留变量总结
2008/12/04 PHP
浅析php插件 HTMLPurifier HTML解析器
2013/07/01 PHP
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
2013/11/26 PHP
zend framework文件上传功能实例代码
2013/12/25 PHP
Yii+MYSQL锁表防止并发情况下重复数据的方法
2016/07/14 PHP
laravel框架模型和数据库基础操作实例详解
2020/01/25 PHP
javascript 延迟加载技术(lazyload)简单实现
2011/01/17 Javascript
jQuery学习笔记之控制页面实现代码
2012/02/27 Javascript
JavaScript操作Cookie详解
2015/02/28 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
常用jQuery代码分享
2015/07/14 Javascript
不定义JQuery插件 不要说会JQuery
2016/03/07 Javascript
vue.js全局API之nextTick全面解析
2017/07/07 Javascript
前端常见跨域解决方案(全)
2017/09/19 Javascript
vue cli webpack中使用sass的方法
2018/02/24 Javascript
AngularJS自定义表单验证功能实例详解
2018/08/24 Javascript
PHP实现基于Redis的MessageQueue队列封装操作示例
2019/02/02 Javascript
详解Node.js一行命令上传本地文件到服务器
2019/04/22 Javascript
VUE脚手架具体使用方法
2019/05/20 Javascript
JS面试题中深拷贝的实现讲解
2020/05/07 Javascript
[01:13:46]iG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
pandas apply 函数 实现多进程的示例讲解
2018/04/20 Python
使用python opencv对目录下图片进行去重的方法
2019/01/12 Python
Python csv文件的读写操作实例详解
2019/11/19 Python
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
2020/06/17 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
2019年.net常见面试问题
2012/02/12 面试题
医学护理系毕业生求职信
2013/10/01 职场文书
护士毕业生自荐信
2014/02/07 职场文书
《小壁虎借尾巴》教学反思
2014/02/16 职场文书
励志演讲稿800字
2014/08/21 职场文书
2015年个人工作总结报告
2015/04/25 职场文书
2015年英语教师工作总结
2015/05/20 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书