约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

约瑟夫环运作如下:

1、一群人围在一起坐成环状(如:N)

2、从某个编号开始报数(如:S)

3、数到某个数(如:M)的时候,此人出列,下一个人重新报数

4、一直循环,直到所有人出列  ,约瑟夫环结束

模拟过程,求出最后的人。

把数组看成一个环,从第s个元素开始按m-1间隔删除元素,重复过程,直到元素全部去掉。

void Josephus(int a[],int n,int m,int s)
{int i,j;int k=n;for(i=0;i<n;i++)a[i]=i+1;//编号i=(s+n-1)%n;while(k){for(j=1;j<m;j++)i=(i+1)%k;//依次报数,头尾相连printf("%d\n",a[i]);//出局for(j=i+1;j<k;j++)a[j-1]=a[j];//删除本节点k--;}//模拟结束,最后输出的就是留下的人
}

可以用带头单循环链表来求解:

也是一样的,只是实现不同,给出核心代码:

    while(k){for(j=1;j<m;j++){pr=p;p=p->link;if(p==head)//头结点跳过{pr=p;p=p->link;}}k--;//打印pr->link=p->link;//删结点free(p);p=pr->link;//从下一个继续}

双向循环链表也可以解,和单链表类似,只是不需要保持前趋指针。

数学可解:

效率最高


int check_last_del(int n,int m)
{int i = 1;int ret = 0;for (i = 2; i<=n;i++)ret = (ret + m) %i;return ret+1;//因为ret是从0到n-1,最后别忘了加1。
}

约瑟夫环-(数组、循环链表、数学)相关推荐

  1. 约瑟夫环之循环链表实现

    约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开 始报数,数到m的那个人又出列:依此规律 ...

  2. 约瑟夫环问题(数学方法)

    问题描述: 约瑟夫环问题(Josephus) 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出.写出C程序. 解法一: 思路:建立一个有N个元素的循环链表,然后从链表表头遍 ...

  3. C语言解决经典问题约瑟夫环--数组

    什么时约瑟夫环问题? 约瑟夫问题,是一个计算机科学和数学中的问题,在计算机编程的算法中,类似问题又称为约瑟夫环,又称"丢手绢问题". 问题的大致内容就是:一共有N个人,从1开始报数 ...

  4. 约瑟夫环 单向循环链表实现

    约瑟夫环 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围 ...

  5. python约瑟夫环单向循环链表_约瑟夫环的单向循环链表的实现代码

    /************************************************************************* > File Name: JosephCir ...

  6. 约瑟夫环问题(数学递推法)

    约瑟夫环问题起源于一个犹太故事: 罗马人攻占了桥塔帕特,41个人藏在一个山洞中躲过了这场浩劫.这41个人中,包括历史学家Josephus(约瑟夫)和他的一个朋友.剩余的39个人为了表示不向罗马人屈服, ...

  7. 约瑟夫环(循环链表)

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

  8. Java 约瑟夫环(循环链表解决)

    问题描述:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉.例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1. 解题思路:因为是围成一圈,所以用循环链表是最符 ...

  9. java约瑟夫环 循环链表_约瑟夫环_循环链表JAVA解答

    编写测试案例 public class Cicle { @Test public void test() { LinkedList linkedList = new LinkedList(); lin ...

最新文章

  1. Matlab与线性代数 -- 矩阵的秩
  2. 世界人工智能创新大赛来了!
  3. 中国AI创新者论坛将于3月21日在清华大学举办
  4. V4L2框架分析学习二
  5. 微软的.NET Core开始支持Raspberry Pi 3
  6. 二维数组排序 行与列分别升序_6个经典排序技巧,尤其是最后一个,绝对的个性化...
  7. cookie记录了服务器相关的信息,使用cookie记录信息(精选).ppt
  8. disk磁盘管理与Linux驱动编写
  9. L2-026 小字辈-PAT团体程序设计天梯赛GPLT
  10. 力扣——合并两个有序链表
  11. [CareerCup] 17.1 Swap Number In Place 互换位置
  12. 无效镜像问题image has dependent child images
  13. Visual Studio 报错:未能加载工具箱项,将从项目中移除
  14. (转)转给入职新人得体会
  15. android用户中心头像选择功能的方法实现
  16. 一文教你用 Neo4j 快速构建明星关系图谱
  17. VGA显示器字符显示
  18. 阿里云域名证书免费认证教程
  19. 霍兰德职业规划测试软件,发现你的职业兴趣——霍兰德职业兴趣测试
  20. 互联网公司招聘--奇虎360--技术类--2013年笔试题

热门文章

  1. UWidgetBlueprintLibrary
  2. Linux Kbuild文档 3
  3. 中国的程序员为什么这么辛苦?
  4. WinCE6下的kernelIoControl使用方法
  5. activexobject对象不能创建_Oracle数据库用户管理之系统权限和对象权限
  6. 【转】wpf从我炫系列2----布局控件的使用(下)
  7. 【转】C#开发笔记之05-迭代器中的状态机(State Machine)到底是什么?
  8. 第六节:深入研究Task实例方法ContinueWith的参数TaskContinuationOptions
  9. sharepoint的文件是怎样存放的及存放的表是哪个
  10. MOSS/Sharepoint RBS概念以及运用