约瑟夫环问题的链表解法和数学解法(PHP)

约瑟夫环问题

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

链表解法

function king($n,$m){
    $monky = range(1,$n);
    $i = 0;
    while(count($monky)>1){
        $i+=1;
        $head = array_shift($monky);
        if($i%$m!=0){
            array_push($monky,$head);
        }
    }
    return $monky[0];
}
echo king(10,3);

数学解法

  • x’ = 2 3 4 5 0
  • x = 0 1 2 3 4
  • x’ = (x+m)%n
    function king2($n,$m){
        $r = 0;
        for($i=2;$i<=$n;$i++){
            $r = ($r+$m)%$i;
        }
        return $r+1;
    }
    echo king2(10,3);
    

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 01:28:17

约瑟夫环问题的链表解法和数学解法(PHP)的相关文章

经典面试题楼层丢鸡蛋问题的动态规划解法与数学解法

原题: 有2个鸡蛋,从100层楼上往下扔,以此来测试鸡蛋的硬度.比如鸡蛋在第9层没有摔碎,在第10层摔碎了,那么鸡蛋不会摔碎的临界点就是9层. 问:如何用最少的尝试次数,测试出鸡蛋不会摔碎的临界点? 注意:只有两个鸡蛋.第一个鸡蛋碎了,第二个鸡蛋只能挨个楼层测试了. 动态规划解法: //height为楼层数 const int maxHeight = 100; int dp[maxHeight + 5] = { 0 }; for (int height = 1; height <= maxHei

约瑟夫环(猴子问题)最快解法

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

约瑟夫环(猴子问题)递归思路解法

“约瑟夫环”是一个数学的应用问题:一群猴子排成一圈,按1,2,…,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数, 再数到第m只,在把它踢出去…,如此不停的进行下去, 直到最后只剩下一只猴子为止,那只猴子就叫做大王.要求编程模拟此过程,输入max.size, 输出最后那个大王的编号. 对于这个问题,可以这么解:每次有猴子出列后,就给所有猴子重新编号:首先第一个出列的猴子编号NO1=(size % max)==0 ? max : (size % max)(作判断是因为si

小朋友学数据结构(1):约瑟夫环的链表解法、数组解法和数学公式解法

约瑟夫环的链表解法.数组解法和数学公式解法 约瑟夫环(Josephus)问题是由古罗马的史学家约瑟夫(Josephus)提出的,他参加并记录了公元66-70年犹太人反抗罗马的起义.约瑟夫作为一个将军,设法守住了裘达伯特城达47天之久,在城市沦陷之后,他和40名死硬的将士在附近的一个洞穴中避难.在那里,这些叛乱者表决说"要投降毋宁死".于是,约瑟夫建议每个人轮流杀死他旁边的人,而这个顺序是由抽签决定的.约瑟夫有预谋地抓到了最后一签,并且,作为洞穴中的两个幸存者之一,他说服了他原先的牺牲品

约瑟夫环的数学解法

CSDN链接 问题描述:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列.求最后剩下的人的初始编号. 可以把问题转换成:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数.求胜利者的编号.则所得的解加1即为原问题的解: 一般我们采用一个循环队列来模拟约瑟夫环的求解过程,但是如果n比较大的时候,采用模拟的方

约瑟夫环 数学解法 f(n,k)=(f(n-1,k)+k)%n 公式讲解

问题:有n个人站成环 从1开始报数,报k的人去死,之后下一个人报1,问当你是第几个的时候可以活下来? 这篇文章主要是讲解  f(n,k)=(f(n-1,k)+k)%n 这个公式是什么意思为什么是对的 虽然公式是使用数学解法 但开始时我会手动的模拟过程 其是有意义的 十分有助于理解 首先我们看样一个问题 n=2, k=3 a b 我们首先使用人力来数 a b a 很好 a死 接下来在试一遍 n=2 k=4 a b 人力:a b a b 很好b死 n=2 k=5 人力 a b a b a 很好a死

约瑟夫环问题的两种实现[链表+数组]

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列. 以下是使用循环链表和数组的两种实现: 1 #include<iostream> 2 using namespace std; 3 4 struct Node 5 { 6 int data; 7 Node *next; 8 }; 9 void CreateLink

Josephus环的四种解法(约瑟夫环)

约瑟夫环 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列.通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解引用别人的一个图:直观说明问题 分析: 第一步:从1开始报数为3的时候就删除3号结点第二步:从4号结点开始报数,当为3的时候删除6号结点:第三步:从7号结点开始报数,当为3的时候

【好记性不如烂笔头】约瑟夫环问题之形象解法(其实就是实实在在的模拟一下游戏过程)

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 约瑟夫环游戏 8 { 9 class Program 10 { 11 /* 12 * 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围. 13 * 从编号为k的