`
ackerman
  • 浏览: 72705 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Josephus环

 
阅读更多

/*************************************************************************
  *                             约瑟夫环问题
  *n个人围成一圈,用1-n编号,从1号开始报数,报到m的人出局,下一个人从1继续
  *报数,求最后出列的人的编号。
  *
  *                                 解法
  *(1)稍微将问题转化一下,让编号从0开始,到n-1;
  *(2)假设第一次报数后,s出局,则s=m%n-1,下次从k=m%n开始报数;
  *(3)此时重新编号,k->0,k+1->1,k+2->2,...
  *(4)恰好我们在这个时候知道了问题的答案,这个人在第二次编号中为q,
  *     在第一次编号中为p,则有p=(q+k)%n=(q+m%n)%n=(q+m)%n,
  *(5)则得到此问题的通项公式
  *     f(1)=0;
  *     f(n)=(f(n-1)+m)%n n>1;
  *(6)若从1开始编号,假设m%n==0,则第一次出局的人的编号是0(实际是n),
        这样就要再做进一步处理。如果从0开始编号,就会避免这个问题。
  *     最后的结果转换只相差1.
  ************************************************************************/
#include <stdio.h>

/**
 * josephus - 
 * @n: total persons
 * @m: count to
 * @k: start with the person k
 */
int josephus(int n, int m, int k)
{
        int i;
        int s=0;
        for(i=2;i<=n;i++)
                s=(s+m)%i;
        return (s+k-1)%n+1;
}
int main(int argc, char *argv[])
{
        int m, i;
        m = 3;
        /*start with person 1 */
        for(i=1;i<=20;i++)
                printf("\tThe result is :%d when n=%d m=%d k=1\n",josephus(i,m,1),i,m);
        return 0;
}

 结果

	The result is :1 when n=1 m=3 k=1
	The result is :2 when n=2 m=3 k=1
	The result is :2 when n=3 m=3 k=1
	The result is :1 when n=4 m=3 k=1
	The result is :4 when n=5 m=3 k=1
	The result is :1 when n=6 m=3 k=1
	The result is :4 when n=7 m=3 k=1
	The result is :7 when n=8 m=3 k=1
	The result is :1 when n=9 m=3 k=1
	The result is :4 when n=10 m=3 k=1
	The result is :7 when n=11 m=3 k=1
	The result is :10 when n=12 m=3 k=1
	The result is :13 when n=13 m=3 k=1
	The result is :2 when n=14 m=3 k=1
	The result is :5 when n=15 m=3 k=1
	The result is :8 when n=16 m=3 k=1
	The result is :11 when n=17 m=3 k=1
	The result is :14 when n=18 m=3 k=1
	The result is :17 when n=19 m=3 k=1
	The result is :20 when n=20 m=3 k=1
 
分享到:
评论

相关推荐

    josephus 环问题

    Josephus环的问题看起来很简单,假设有n个人排成一个圈。从第一个人开始报数,数到第m个人的时候这个人从队列里出列。然后继续在环里数后面第m个人,让其出列直到所有人都出列。求所有这些人出列的排列顺序。

    Josephus环算法的设计(链式存储结构)

    代码比较清晰 易懂 规范 找了很多从中挑选出来的

    简单Josephus环模拟器

    简单Josephus环模拟器,可输入游戏人数、起点,自动投掷骰子

    约瑟夫(Josephus)环问题

    2、 约瑟夫(Josephus)环问题:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止。报m...

    用c语言实现josephus环问题

    #include #include #define NULL 0 #include typedef struct Lnode{ int data; struct Lnode *next; }joseph;

    Josephus_java_josephus环代码_

    Java约瑟夫环演示Applet源码,只要安装有JRE包,就可以打开压缩包中的MainApplet.html运行程序,看到演示效果。

    单向和双向循环链表实例(Josephus环问题)

    Josephus问题可以描述为如下的一个游戏:N个人编号从1到N,围坐成一个圆圈,从1号开始传递一个热土豆,经过M次传递后拿着土豆的人离开圈子,由坐在离开的人的后面的人拿起热土豆继续进行游戏,直到圈子只剩下最后一...

    java实现约瑟夫环问题Josephus

    java实现约瑟夫环问题Josephus 约瑟夫问题 * 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k(1,2,3...n)的人开始报数,数到m(1,2,3...)的那个人出列; * 他的下一个人又从1开始报数,...

    josephus环问题的Python代码

    Data Structure 数据结构课,河内环的代码,希望对大家有用!

    c++实现Josephus问题

    设有n个人围坐一圈并由1到n编号,从某个人开始报数,数到m的人出列,接着从出列的下一个人开始重新1到n报数,数到m的人又出列,如此反复地报数和出列,直到最后一个人出列为止,设计确定这n个人出列序列的程序

    Josephus环的四种解法(约瑟夫环)基于java详解

    主要介绍了Josephus环的四种解法(约瑟夫环)基于java详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    数据结构课程设计成品 joseph环

    详细的题目分析,包括具体的分析论文和完整的源代码

    单链表实现约瑟夫环

    单链表解决约瑟夫环问题

    C++约瑟夫环 课程设计 数据结构

    一开始任选一个整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此...

    Josephus出列问题

    用单链表作数据结构实现计算Josephus问题的通用算法。 输入的元素个数为n,从第s个元素开始计数,数到第m个数据出列。

    Josephus环问题

    实现数据结构课后上机 ,约瑟夫问题,实现m人,顺序报号淘汰第N人,求最后剩下人的序号。

    C++的编写约瑟夫(josephus)环函数

    本文给大家分享了C++的编写约瑟夫(josephus)环函数。

    约瑟夫环实习报告

    数据结构的实习报告!包括运行程序源代码和结果,还有实习报告的标准范本

    约瑟夫环Josephus问题

    约瑟夫(Josephus)环问题:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止。报m的人...

Global site tag (gtag.js) - Google Analytics