0

0

PHP丢手帕问题实例详解

小云云

小云云

发布时间:2018-03-10 09:20:54

|

1733人浏览过

|

来源于php中文网

原创

问题描述:有n个人围成一圈,然后从任意指定的一个 人那里为起点,以m个人为单位,每转m个人第m个人被杀死。求最后不会被杀死的人。

遗留问题:

在此用php做简单的实现,php中对递归有100次的深度限制,所以在此不用递归,用循环;php中处理数组的函数比较多,所以采用顺序表(数组),顺序表删除元素比较复杂,所以效率比较低,只能处理10000一下的数据。链表中的遍历比较复杂,同样会导致效率低下,以后再做顺序表与链表的结合。

模拟实现:

  1. class Dhc  
    {  
        private function dropHandkerchief($start=0,$distance,$menArray)  
        {  
            $count = count($menArray);    
            $pos = $distance - 1;    
            $start = $start > ($count-1) ? 0 : $start;//开始位置大于总人数则默认从第一个开始    
            $pos = $start + $pos;//第一个要被出列的人的位置,pos为下标,所以要 -1;    
            while($count > 1)    
            {    
                if($pos < $count)//判断要出列的人的位置是否超出数组大小,超出则减去(或取模)数组大小,从头开始    
                {    
                    echo "第". $menArray[$pos] ."人出列
    "; array_splice($menArray,$pos,1);//删除要出列的人 $count = count($menArray);//重新计算大小 $pos += $distance - 1;//下一个要出列的人的位置,pos 为要数的第一个人,所以第 n 个人的下标为 pos + n -1 }else { //$pos -= $count; $pos = $pos % $count; } } echo '
    '; echo "第" .$menArray[0]. "人被留下"; } public function drop() { $menArray = array();// $total = 100;//总人数 $distance = 50;//间隔人数 $start = 3;//从第几个人开始 $i = 0; while($i < $total)//初始化 { $menArray[$i] = $i + 1; $i++; } $this->dropHandkerchief($start, $distance, $menArray); } }

数学推导实现:(20170914)

立即学习PHP免费学习笔记(深入)”;

简单改变一下问题的描述:有 n 个人,编号是 0 - n-1,从 0 开始数,数到 m 则 m 死,下一个人继续从 0 开始数,直到只剩最后一个人,求这个人最开始的编号。

每死一个人就重新开始,相当于减小了问题的规模,就是要解 n 个规模的解:n, n-1, n-2, n-3 …… 3, 2, 1。

假如在第二轮(n-1个人的规模)中死的那个人编号是 x(这个编号是第一个人死后,重新从 0 开始编排的),则可以推导出这个人在第一轮(人数为 n 时)中的编号是:(x + m)%n。

PHP经典实例(第二版)
PHP经典实例(第二版)

PHP经典实例(第2版)能够为您节省宝贵的Web开发时间。有了这些针对真实问题的解决方案放在手边,大多数编程难题都会迎刃而解。《PHP经典实例(第2版)》将PHP的特性与经典实例丛书的独特形式组合到一起,足以帮您成功地构建跨浏览器的Web应用程序。在这个修订版中,您可以更加方便地找到各种编程问题的解决方案,《PHP经典实例(第2版)》中内容涵盖了:表单处理;Session管理;数据库交互;使用We

下载

(n-2)中死的人在(n-1)中的编号是:(x + m)%(n-1)

(n-3)中死的人在(n-1)中的编号是:(x + m)%(n-2)

( 1 )中死的人在( 2 )中的编号是:(x + m)%2, 此时 x = 0;

把上面的过程倒过来,已知规模为 1 时,x = 0;

求规模为 2 时,x2 的值:(x + m) % 2 = x2

求规模为 3 时,x3 的值:(x2 + m) % 3 = x3

求规模为 n 时 x 的值。

  1. $n = 100;  
    $m = 3;  
    $s = 0;  
      
    $x = 0;  
    for ($i=2; $i<=$n; $i++) {  
        $x = ($x + $m) % $i;  
    }  
    echo ($x + $s) % $n;  
    // $s=0,表示从第 0 个开始数,如果不是从 0 开始,则只需要向后推 $s 个即可

相关文章

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

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

下载

相关标签:

php

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

相关专题

更多
高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

68

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

127

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

54

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

19

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

85

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

40

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

11

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

49

2026.01.15

热门下载

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

精品课程

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

共137课时 | 8.8万人学习

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

共6课时 | 7.7万人学习

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

共13课时 | 0.9万人学习

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

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