算法,约瑟夫问题

<?php
/**
 * 跟猴子问题比较相似,最后一个是大王。约瑟夫是最后两个是存活。
 * 约瑟夫问题是个有名的问题:
 * N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。
 * 例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。
 */

 function getLastTwo() {
     $people = 41;
     $killNum = 3;

     // 初始化数据
     $people_arr = range(1,$people);

     for ($i = 1 ; $i <= $killNum * ($people -2);$i++) {
        $speak_num = array_shift($people_arr);
        if ($i % $killNum == 0) {
            echo "死了".$speak_num."<br/>";
        } else {
            // 放到后面
            array_push($people_arr,$speak_num);
        }
     }

     // 输出活着的人
     foreach($people_arr as $alive) {
         echo "我".$alive."还活着!<br/>";
     }
 }

 getLastTwo();

结果:

死了3
死了6
死了9
死了12
死了15
死了18
死了21
死了24
死了27
死了30
死了33
死了36
死了39
死了1
死了5
死了10
死了14
死了19
死了23
死了28
死了32
死了37
死了41
死了7
死了13
死了20
死了26
死了34
死了40
死了8
死了17
死了29
死了38
死了11
死了25
死了2
死了22
死了4
死了35
我16还活着!
我31还活着!

原文地址:https://www.cnblogs.com/jiqing9006/p/12190091.html

时间: 2024-07-31 21:45:34

算法,约瑟夫问题的相关文章

基本算法——约瑟夫环问题

关于约瑟夫环问题,我们可以从两种思路去实现,一种是用数组,另一种是采用链表. 用数组方法实现代码: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #define M 8 5 int find(int *arr, int len); 6 int main(int argc, char* argv[]) 7 { 8 int size = atoi(argv[1]); 9 int* arr

[经典算法]约瑟夫问题

题目说明: 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人 开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止.然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏. 题目解析: 约瑟

趣味算法--约瑟夫环问题

问题描述 已知n个人(以编号1,2,3,...,n分别表示)围坐在一张圆桌上.指定编号为k的人开始从1报数,数到m的那个人出列:出列那个人的下一位又从1开始报数,数到m的那个人出列:以此规则重复下去,直到圆桌上的人全部出列. 分析解决 解决方法主要有逻辑分析.数学分析法. 逻辑分析:就是按照游戏规则一个个报数,报到m的人出局,结构层次简单清晰明了.这种方式实现主要采用顺序表实现 数学分析:采用数学方式归纳统计分析出每次出局人的规律,直接得出每次出局的人,然后以代码实现.这种方法需要较强的数学分析

一天一练之算法——约瑟夫问题

猴子选王 一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王. #include <stdio.h> #include <stdlib.h> int JosephusFun(int nAllCount,int nStep) { int *npIndex=NULL , i=0 ,nCount=0; npIndex=(int *)malloc(s

约瑟夫问题 -- python实现

问题描述 N个人围成一个圈, 从第一个人开始报数, 报到M的人出圈, 剩下的人继续从1开始报数, 报到M的人出圈;如此往复, 直到所有人出圈. 列表解决 def solution_list(n, m): """ 初始化一个长度为n的列表, 默认值为True. 当某个元素出圈时, 将其置为False. 循环迭代这个列表, 遇到值为False的元素则跳过, 当列表中全为False时表示所有人 都已出圈. """ # 初始化列表 people = []

PK1325-Android从程序员到架构师之路高

随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到程序开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了.对于学习有困难不知道如何提升自己可以加扣:1225462853进行交流得到帮助,获取学习资料. 下载地址:http://pan.baidu.com/s/1jI05TPW 学前基础 1.掌握Java基本语法,了解面向对象编程特点,有基本Java语言编程经验 2.了解计算机系统.数据结构基础知识,掌握SQL基本语法

CSP-S 初赛问题求解与选择题

# CSP-S 初赛问题求解与选择题 ## 时间复杂度计算 公式:对于 $T(n) = a \times T(\dfrac{n}{b})+O(n^d)$ 这个递推式,其时间复杂度为:$$T(n) = \begin{cases}O(n^{\log_b a}) , \ a > b^d \\\\O(n^d \lg n) , \ a = b^d \\\\O(n^d) , \ a<b^d\end{cases}$$ ## 鸽巢原理 ### 基本定义 若有 $n$ 个鸽巢,$n+1$ 只鸽子,则至少有一个鸽

算法系列:约瑟夫斯问题

约瑟夫斯问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环. 有{\displaystyle n}个囚犯站成一个圆圈,准备处决.首先从一个人开始,越过{\displaystyle k-2}个人(因为第一个人已经被越过),并杀掉第k个人.接着,再越过{\displaystyle k-1}个人,并杀掉第k个人.这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着. 问题是,给定了{\displaystyle n}和{

一道约瑟夫算法题的简单设计

说约瑟夫问题,网上是有一大堆各种各样的文章,想必也给出了各种各样的代码,但这却不能阻挡我写这篇博文的心啊,要知道我才刚刚开通个博客不写点什么总觉得空虚.... 那么就先来讲一下我所要解决的问题:N个人围坐成一圈,从1开始顺序编号:游戏开始,从第一个人开始由1到m的顺序报数,报道m的人退出圈外,问最后留下来那个人原来的序号. (百度了一下发现,原题目不是推出圈外而是"39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式"...) 好吧回归正题,我们继续讲这个算法. 在这里我们用

算法:约瑟夫环问题

算法:约瑟夫环问题 [写在前面] 由于本人天生驽钝,所写代码和描述可能不堪入目,高手请移步.但是我一直在努力记录一下有用的知识点,给自己给朋友用,只是希望对大家有帮助. [问题描述] 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从第一个人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,求最后一个出圈的人的标号. [代码] void JOSEF(int n,int m) //:n个人