报数(约瑟夫环问题)
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;
}
报数(约瑟夫环问题)相关推荐
- 报数——约瑟夫环问题
报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号.从第一个人开始报数,报到m(<n)的人退出圈子:下一个人从1开始报数,报到m的人退出圈子.如此下去,直到留下最后一个人. 本题要求编写函 ...
- Java实现约瑟夫环问题
约瑟夫环问题起源于一个犹太故事.约瑟夫环问题的大意如下: 罗马人攻占了桥塔帕特,41个人藏在一个山洞中躲过了这场浩劫.这41个人中,包括历史学家Josephus(约瑟夫)和他的一个朋友.剩余的39个人 ...
- C语言约瑟夫报数出圈算法,c语言实现约瑟夫环问题
(一)基本问题 1.问题描述 设有编号为1,2,-,n的n(n>0)个人围成一个圈,每个人持有一个密码m.从第一个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m ...
- 实验题目:约瑟夫环问题:设编号为1,2,3,……,n的n(n>0)个人按顺时针方向围坐一圈,m为任意一个正整数。从第一个人开始顺时针方向自1起顺序报数,报到m时停止并且报m的人出列,再从他的下一个人
实验题目:约瑟夫环问题:设编号为1,2,3,--,n的n(n>0)个人按顺时针方向围坐一圈,m为任意一个正整数.从第一个人开始顺时针方向自1起顺序报数,报到m时停止并且报m的人出列,再从他的下一 ...
- 烽火算法题 报数问题(不是约瑟夫环)双向链表 Java实现与C实现
报数问题 报数问题 解答 1.题目要求 2.解题思路 3.代码实现 3.1 java版本 3.2 c版本 4.问题总结 报数问题 时间限制:3000MS 内存限制:589824KB 题目描述: 当n个 ...
- 【C++】约瑟夫环问题:任给正整数n和k,按下述方法可以得到1,2, …n的一个置换:将数字1,2,…,n环形排列,按顺时针方向自1开始报数,报到K时输出该位置上的数字,并使其出列。
题目分析 约瑟夫环问题:任给正整数n和k,按下述方法可以得到1,2, -n的一个置换:将数字1,2,-,n环形排列,按顺时针方向自1开始报数,报到K时输出该位置上的数字,并使其出列.然后从他在顺时针方 ...
- 约瑟夫环问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。...
首先,我最大的学习来源不是百度而是我群友~~在这里表白一波我热爱学习的群友们! 然后今天群里突然有人提出了题目的这个问题: 有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人 ...
- 【约瑟夫环】Java实现:100个人开始从1开始报数,每当报数到3,报数3的人离开,求最后留下来人的位置。
[约瑟夫环]Java实现:100个人开始从1开始报数,每当报数到3,报数3的人离开,求最后留下来人的位置. 原创 2017年03月15日 00:21:36 标签: 约瑟夫环问题 1023 问题背景:约 ...
- C语言用数组1. 简单约瑟夫环问题: N个人,编号从1~N围成一圈,输入一个数T,从1号开始报数,报到T的人出圈;下一人又从1开始报数,下一个报到T的人出圈,输出出圈顺序。 考虑问实现约瑟夫环问题
1. 简单约瑟夫环问题: N个人,编号从1~N围成一圈,输入一个数T,从1号开始报数,报到T的人出圈:下一人又从1开始报数,下一个报到T的人出圈,输出出圈顺序. 考虑问题: 报到T的人出圈,怎么表示出 ...
- 约瑟夫环问题有10(100人或者n个)个人围成一圈,从第一个人开始报数(报1、2、3),只要报3的人就出去, 然后不停的循环报数,直到最后剩下一个人,计算出这个人最开始的位置。
有10(100人或者n个)个人围成一圈,从第一个人开始报数(报1.2.3),只要报3的人就出去, 然后不停的循环报数,直到最后剩下一个人,计算出这个人最开始的位置.其实就是约瑟夫环问题 新手小白,多多 ...
最新文章
- 做销售如何跟单,逼单!共20招!(转)
- 用 Fiddler 来弥补 Chrome Network 的小缺点
- python位置参数ppt_如何在Python中使用一个或多个相同的位置参数?
- (转)Hibernate的优化方案
- 在网站中使用Cookie的简单例子
- php 百度天气,php使用百度天气接口示例
- Git图形化操作:Revert(恢复)本地的修改到上一个版本
- C# Excel 删除指定的工作表
- 电线的粗细与电流的大小怎么算?电流的大小与电器的功率有什么关系? 如何根据电流的大小选择铜质电线的粗细...
- 别做正常的傻瓜 读书笔记
- 【ProVerif学习笔记】1:基本使用流程
- RHCE 考试经验总结
- inception-v3模型神经网络图片识别系统搭建详细流程(1)
- Java开发月薪两万,需要达到怎样的技术水平?
- 【JAVA】(vip)蓝桥杯试题 基础练习 阶乘计算 BASIC-30 JAVA
- Cohort analysis
- Python 小技之繁花盛开
- oracle透明加密部署及场景使用
- 手机re怎么刷linux,手机刷机刷入recovery的方法小米刷recovery固件方法
- 【PPT+套图】iFeve沙龙