0

0

php约瑟夫问题如何解决

小云云

小云云

发布时间:2018-03-28 11:26:39

|

1603人浏览过

|

来源于php中文网

原创

“约瑟夫环”是一个数学的应用问题:一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数, 再数到第m只,在把它踢出去…,如此不停的进行下去, 直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。

下面列出了三种用PHP来解决此问题的方法:

  1. 按逻辑依次去除

  2. 递归算法

  3. 线性表应用

方法一,按照逻辑依次去除

function getKingMokey($n, $m)  
{  
    $monkey[0] = 0;  
    //将1-n只猴子顺序编号 入数组中
    for($i= 1; $i<= $n; $i++)   
    {   
        $monkey[$i] = $i;  
    }  
    $len = count($monkey);  
    //循环遍历数组元素(猴子编号)
    for($i= 0; $i< $len; $i= $i)  
    {  
        $num = 0;  
        /* 
         * 遍历$monkey数组,计算数组中值不为0的元素个数(剩余猴子的个数) 
         * 赋值为$num,并获取值不为0的元素的元素值 
        */
        foreach($monkeyas$key => $value)   
        {   
           if($value == 0) continue;   
           $num++;   
           $values = $value;   
        }  
        //若只剩一只猴子 则输出该猴子编号(数组元素值) 并退出循环 
        if($num == 1)   
        {   
            return$values;  
            exit;   
        }  
        /*  
         * 若剩余猴子数大于1($num > 1)  
         * 继续程序  
        */
        //将第$i只猴子踢出队伍(相应数组位置元素值设为0) 
        $monkey[$i] = 0;  
        /* 
         * 获取下一只需要踢出队伍的猴子编号 
         * 在$m值范围内遍历猴子 并设置$m的计数器 
         * 依次取下一猴子编号 
         * 若元素值为0,则该位置的猴子已被踢出队伍 
         * 若不为0,继续获取下一猴子编号,且计数器加1 
         * 若取得的猴子编号大于数组个数 
         * 则从第0只猴子开始遍历(数组指针归零) 步骤同上 
         * 直到计数器到达$m值 * 最后获取的$i值即为下一只需要踢出队伍的猴子编号 
         */
        //设置计数器 
        for($j= 1; $j<= $m; $j++)   
        {   
            //猴子编号加一,遍历下一只猴子 
            $i++;  
            //若该猴子未被踢出队伍,获取下一只猴子编号 
            if($monkey[$i] > 0) continue;  
            //若元素值为0,则猴子已被踢出队伍,进而循环取下一只猴子编号 
            if($monkey[$i] == 0)   
            {   
                //取下一只猴子编号 
                for($k= $i; $k< $len; $k++)  
                {   
                    //值为0,编号加1 
                    if($monkey[$k] == 0) $i++;  
                    //否则,编号已取得,退出 
                    if($monkey[$k] > 0) break;  
                }   
             }  
            //若编号大于猴子个数,则从第0只猴子开始遍历(数组指针归零) 步骤同上 
            if($i == $len) $i = 0;  
            //同上步骤,获取下一只猴子编号
            if($monkey[$i] == 0)   
            {   
                for($k= $i; $k< $len; $k++)   
                {  
                    if($monkey[$k] == 0) $i++;  
                    if($monkey[$k] > 0) break;  
                }   
            }   
        }  
    }  
}  
//猴子个数 
$n = 10;  
//踢出队伍的编号间隔值 
$m = 3;  
//调用猴王获取函数
echo getKingMokey($n, $m)."是猴王";  
方法二,递归算法
[php] view
 plain copy
function killMonkey($monkeys , $m , $current = 0){  
    $number = count($monkeys);  
    $num = 1;  
    if(count($monkeys) == 1){  
        echo$monkeys[0]."成为猴王了";  
        return;  
    }  
    else{  
        while($num++ < $m){  
            $current++ ;  
            $current = $current%$number;  
        }  
        echo$monkeys[$current]."的猴子被踢掉了
"; array_splice($monkeys , $current , 1); killMonkey($monkeys , $m , $current); } } $monkeys = array(1 , 2 , 3 , 4 , 5 , 6 , 7, 8 , 9 , 10); //monkeys的编号 $m = 3; //数到第几只猴子被踢出 killMonkey($monkeys , $m);
    方法三,线性表应用
  1. function yuesefu($n,$m) {    
        $r=0;    
        for($i=2; $i<=$n; $i++) {  
            $r=($r+$m)%$i;    
        }  
        return$r+1;    
    }    
    echo yuesefu(10,3)."是猴王";

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

12

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

4

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

18

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

19

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 10.3万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号