C时间限制:1 毫秒 |  C内存限制:3000 Kb
题目内容:
 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的

人退出圈子,问最后留下的是原来第几号的那位?
输入描述
正整数n

输出描述
直接输出结果

输入样例
10

输出样例

4

要想用到递归法就必须找到f(n)和f(n-1)之间的关系,那么约瑟夫环有没有这样一个规律关系在呢,答案是有的。

我们假设n个人,报数到m的退出,最后剩下人的编号为x。那么第一次报数后,编号为m的人退出,那么剩下的人从编号为M+1继续报数,如果我们把m+1看成1,m+2看成2,....,n看成n-m,1看成是1-m+n,2看成是2-m+n,...,m-1看成是(m-1)-m+n也就是n-1,那么这就变成了一个n-1个人报数为m的约瑟夫环的问题,而且这里最后剩下人就是原来编号为x的那个人,按前面的对应关系f(n)=(f(n-1)+m)%n,这里有个例外,就是如果x=n的话,就会出现f(n)=n,而(f(n-1)+m)%n=((n-m)+m)%n=n%n=0,所以我们把编号加点小技巧,如果n个人编号从0编到n-1,那么f(n)=(f(n-1)+m)%n成立,如果换算成1到n编号,f(n)-1=((f(n-1)-1)+m)%n,也就是f(n)=((f(n-1)-1)+m)%n+1。

有了f(n)=(f(n-1)-1+m)%n+1这个公式,另外我们知道,当n=2时,m为奇数时最后留下的是2,m为偶数时最后留下的是1,我们就可以写出递归程序了,下面是递归法的C语言程序:

#include <stdio.h>  int Joseph(int n,int m)/*计算约瑟夫环的递归函数*/
{  if(n<=1||m<=1)  return -1;  if(n==2)  {  if(m%2==0)  return 1;  else  return 2;  }  else  {  return (Joseph(n-1,m)+m-1)%n+1;  }
}  int main()
{  int n,m,x;  scanf("%d %d",&n,&m);  x=Joseph(n,m);  printf("最后一个数为:%d\n",x);  return 0;
}  

报数(约瑟夫环问题)相关推荐

  1. 报数——约瑟夫环问题

    报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号.从第一个人开始报数,报到m(<n)的人退出圈子:下一个人从1开始报数,报到m的人退出圈子.如此下去,直到留下最后一个人. 本题要求编写函 ...

  2. Java实现约瑟夫环问题

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

  3. C语言约瑟夫报数出圈算法,c语言实现约瑟夫环问题

    (一)基本问题 1.问题描述 设有编号为1,2,-,n的n(n>0)个人围成一个圈,每个人持有一个密码m.从第一个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m ...

  4. 实验题目:约瑟夫环问题:设编号为1,2,3,……,n的n(n>0)个人按顺时针方向围坐一圈,m为任意一个正整数。从第一个人开始顺时针方向自1起顺序报数,报到m时停止并且报m的人出列,再从他的下一个人

    实验题目:约瑟夫环问题:设编号为1,2,3,--,n的n(n>0)个人按顺时针方向围坐一圈,m为任意一个正整数.从第一个人开始顺时针方向自1起顺序报数,报到m时停止并且报m的人出列,再从他的下一 ...

  5. 烽火算法题 报数问题(不是约瑟夫环)双向链表 Java实现与C实现

    报数问题 报数问题 解答 1.题目要求 2.解题思路 3.代码实现 3.1 java版本 3.2 c版本 4.问题总结 报数问题 时间限制:3000MS 内存限制:589824KB 题目描述: 当n个 ...

  6. 【C++】约瑟夫环问题:任给正整数n和k,按下述方法可以得到1,2, …n的一个置换:将数字1,2,…,n环形排列,按顺时针方向自1开始报数,报到K时输出该位置上的数字,并使其出列。

    题目分析 约瑟夫环问题:任给正整数n和k,按下述方法可以得到1,2, -n的一个置换:将数字1,2,-,n环形排列,按顺时针方向自1开始报数,报到K时输出该位置上的数字,并使其出列.然后从他在顺时针方 ...

  7. 约瑟夫环问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。...

    首先,我最大的学习来源不是百度而是我群友~~在这里表白一波我热爱学习的群友们! 然后今天群里突然有人提出了题目的这个问题: 有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人 ...

  8. 【约瑟夫环】Java实现:100个人开始从1开始报数,每当报数到3,报数3的人离开,求最后留下来人的位置。

    [约瑟夫环]Java实现:100个人开始从1开始报数,每当报数到3,报数3的人离开,求最后留下来人的位置. 原创 2017年03月15日 00:21:36 标签: 约瑟夫环问题 1023 问题背景:约 ...

  9. C语言用数组1. 简单约瑟夫环问题: N个人,编号从1~N围成一圈,输入一个数T,从1号开始报数,报到T的人出圈;下一人又从1开始报数,下一个报到T的人出圈,输出出圈顺序。 考虑问实现约瑟夫环问题

    1. 简单约瑟夫环问题: N个人,编号从1~N围成一圈,输入一个数T,从1号开始报数,报到T的人出圈:下一人又从1开始报数,下一个报到T的人出圈,输出出圈顺序. 考虑问题: 报到T的人出圈,怎么表示出 ...

  10. 约瑟夫环问题有10(100人或者n个)个人围成一圈,从第一个人开始报数(报1、2、3),只要报3的人就出去, 然后不停的循环报数,直到最后剩下一个人,计算出这个人最开始的位置。

    有10(100人或者n个)个人围成一圈,从第一个人开始报数(报1.2.3),只要报3的人就出去, 然后不停的循环报数,直到最后剩下一个人,计算出这个人最开始的位置.其实就是约瑟夫环问题 新手小白,多多 ...

最新文章

  1. 做销售如何跟单,逼单!共20招!(转)
  2. 用 Fiddler 来弥补 Chrome Network 的小缺点
  3. python位置参数ppt_如何在Python中使用一个或多个相同的位置参数?
  4. (转)Hibernate的优化方案
  5. 在网站中使用Cookie的简单例子
  6. php 百度天气,php使用百度天气接口示例
  7. Git图形化操作:Revert(恢复)本地的修改到上一个版本
  8. C# Excel 删除指定的工作表
  9. 电线的粗细与电流的大小怎么算?电流的大小与电器的功率有什么关系? 如何根据电流的大小选择铜质电线的粗细...
  10. 别做正常的傻瓜 读书笔记
  11. 【ProVerif学习笔记】1:基本使用流程
  12. RHCE 考试经验总结
  13. inception-v3模型神经网络图片识别系统搭建详细流程(1)
  14. Java开发月薪两万,需要达到怎样的技术水平?
  15. 【JAVA】(vip)蓝桥杯试题 基础练习 阶乘计算 BASIC-30 JAVA
  16. Cohort analysis
  17. Python 小技之繁花盛开
  18. oracle透明加密部署及场景使用
  19. 手机re怎么刷linux,手机刷机刷入recovery的方法小米刷recovery固件方法
  20. 【PPT+套图】iFeve沙龙

热门文章

  1. java 访问Domino LOtus 数据库
  2. 原子性 - synchronized关键词
  3. RecyclerView更全解析之 为它优雅的添加头部和底部
  4. 锚点盒子随滚动条浮动
  5. Coloring Flame Graphs: Code Hues
  6. 顶级SaaS公司的共同基因都有什么?
  7. CI框架 CodeIgniter 伪静态 htaccess设置和Nginx伪静态方法2
  8. Thrift在windows7下的安装与实践
  9. splay tree成段更新,成段查询poj3466
  10. 跨域访问JQuery+.NET实现的一种思路,以及极简单Demo