约瑟环的python实现(举例说明)

 N个人围成一圈报数,报到某一个数m的就出局,问你最后剩下来的人的号码?

网上通用约瑟夫环的算法是:

//函数接收n和m,返回最后出圈的是第几个人
/*e.g.       yuesefu(5,2)=3
                  yuesefu(2,100)=1*/
int   yuesefu(int   n,int   m)
{
        int   i,r=0;
        for   (i=2;i <=n;i++)   r=(r+m)%i;
        return   r+1;
}

用python实现上面算法为:

def yuesefu2(n, m):
    # 网上常见方法,答案准确
    # yuesefu2(50, 5)=19
    i = 0
    r = 0
    for i in range(2, n + 1):
        r = (r + m) % i
    return r + 1

用python模拟报数出局的方法为:

def yuesefu3(n, m):
    a = range(1, n + 1)
    b = []
    i = 0  # 指针
    while n > 1:
        i = i + m
        if i > n:
            i = i % n
        b.append(a.pop(i - 1))
        # print a.pop(i-1)
        n = n - 1
        i = i - 1
        if i == n or i == -1:  # 特别处理,如果正好弹出最后一个,i值归0
            i = 0
    b.append(a[0])
    return b

if __name__ == ‘__main__‘:
    n = 60
    m = 99
    print u‘约瑟环2:‘ + str(yuesefu2(n, m))
    print u‘约瑟环3:‘ + str(yuesefu3(n, m))

50人报5出局答案为:

约瑟环2:19
约瑟环3:[5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 6, 12, 18, 24, 31, 37, 43, 49, 7, 14, 22, 29, 38, 46, 3, 13, 23, 33, 42, 2, 16, 27, 39, 1, 17, 32, 47, 11, 34, 4, 26, 48, 28, 9, 44, 41, 8, 21, 36, 19]

30人报3出局答案为:

约瑟环2:29
约瑟环3:[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 4, 8, 13, 17, 22, 26, 1, 7, 14, 20, 28, 5, 16, 25, 10, 23, 11, 2, 19, 29]

60人报99出局答案为:

约瑟环2:55
约瑟环3:[39, 19, 1, 45, 30, 17, 7, 58, 52, 48, 46, 47, 51, 57, 6, 16, 29, 44, 10, 32, 2, 31, 9, 43, 28, 21, 14, 13, 20, 27, 42, 8, 38, 22, 4, 60, 11, 26, 54, 36, 34, 41, 12, 56, 5, 40, 49, 23, 33, 25, 18, 15, 37, 50, 59, 53, 24, 3, 35, 55]

时间: 2024-10-25 20:49:59

约瑟环的python实现(举例说明)的相关文章

约瑟环问题

1 /* 2 约瑟环问题其实就是一个循环链表的问题 3 */ 4 #include <iostream> 5 #include<ctime> 6 using namespace std; 7 8 //动态规划的思想,有点类似解决主元素问题的思路 9 //巧妙的用0,1数组代替链表节点的删除 10 int sun1(const int N,const int C) 11 { 12 int i=0,j=0,n=N,s=0; 13 int t=0; 14 int *a=new int [

单链表的逆向打印、删除无头的非尾节点、无头链表插入节点、约瑟环

//1.逆向打印链表(递归) void PrintTailToHead(ListNode *pHead) {                 ListNode *cur = pHead;                  if(cur != NULL)                 {                                 PrintTailToHead(cur->_next);                                 printf( "

uva live 3882 And Then There Was One 约瑟夫环

// uva live 3882 And Then There Was One // // 经典约瑟夫环问题.n是规模,k是每次数的人数,m是第一个出列的人. // // 但是暴力用链表做肯定是不行的,因为 1 <= n <= 10000 , 1<= k <= 10000 // 1 <= m <= n; 虽然我知道公式是什么,但是我并不会推导,看了几乎一个下午的 // 数学推导过程,又弄了几个样例亲自动手实验一下,这样才算是有了一点明悟. // 下面来分享一下自己能力范

C++ 约瑟夫环

约瑟夫环: 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列. 例如:n = 9, k = 1, m = 5 [解答]出局人的顺序为5, 1, 7, 4, 3, 6, 9, 2, 8. 1 int main()//约瑟夫环 2 { 3 int n=9, m=5,k=2;//n是人数(编号1,2,……,x),m是出列号,k是起始人编号 4 int

poj 1781 In Danger(约瑟夫环,找规律)

http://poj.org/problem?id=1781 约瑟夫环的模板,每次数到2的人出圈. 但直接求会TLE,n太大. 打表发现答案和n有关系.当n是2的幂的时候,答案都是1,不是2的幂的时候都与小于2的幂那个数相差差值的2的倍数. #include <stdio.h> #include <iostream> #include <map> #include <set> #include <list> #include <stack&

php通过循环链解决约瑟夫环

本想着用php写些数据结构提升一下,写到链的时候看到约瑟夫环问题,尝试用循环链写了一下 约瑟夫环: 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列 代码: <?php header("Content-type: text/html; charset=utf-8"); /** * 约瑟

猴王问题约瑟夫环

[Joseph问题描述]n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数.求胜利者的编号. [求解思路]我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始): k k+1 k+2 ... n-2, n-1, 0, 1, 2, ... k-2 并且从k开始报0. 现在我们把他们的编号做一下转换: k --> 0 k+1 --> 1 k+2 --> 2 ... ... k-2 --&

约瑟夫问题、约瑟夫环

约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环.又称"丢手绢问题".) 1问题来历编辑 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止.然而Jos

通过例子进阶学习C++(七)CMake项目通过模板库实现约瑟夫环

本文是通过例子学习C++的第七篇,通过这个例子可以快速入门c++相关的语法. 1.问题描述 回顾一下约瑟夫环问题:n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局:然后从出局的下一个人重新开始报数,数到第 m 个人,再让他出局......,如此反复直到所有人全部出局为止. 上一篇我们通过数组.静态链表实现了约瑟夫环,具体参考: 通过例子进阶学习C++(六)你真的能写出约瑟夫环么 本文,我们进一步深入分析约瑟夫环问题,并通过c++模板库实现该问题求解,最后我们说明