约瑟夫环(报数出列)问题
2015-11-06 22:16
246 查看
题目描述
已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
输入
7 3
输出
3 6 2 7 5 1 4
算法思路
先假设,编号是0~n-1,报数是从0~m-1,因为只要在最后结果+1,就变回编号1~n了。
第i=1次报数:A)0 1 2 3 4 5 6,n=7,淘汰2,于是变为0 1 3 4 5 6 ,
接下来报数顺序为:B)3 4 5 6 0 1,n=6
第i=2次报数:C)0 1 2 3 4 5,C变回B,只要(C+m)%n即可,
淘汰2,于是变为0 1 3 4 5,接下来报数顺序为:D)3 4 5 0 1,n=5
第i=3次报数:E)0 1 2 3 4,E变回D,只要(E+m)%n即可
以此类推。。。。
我们可以知道:
第i次淘汰的数可以归纳出下面的递归公式:
f(n,m,i)=[f(n-1,m,i)+m]%n;
当i=1时,f(n,m,1)=(n+m-1)%n;
算法如下
已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
输入
7 3
输出
3 6 2 7 5 1 4
算法思路
先假设,编号是0~n-1,报数是从0~m-1,因为只要在最后结果+1,就变回编号1~n了。
第i=1次报数:A)0 1 2 3 4 5 6,n=7,淘汰2,于是变为0 1 3 4 5 6 ,
接下来报数顺序为:B)3 4 5 6 0 1,n=6
第i=2次报数:C)0 1 2 3 4 5,C变回B,只要(C+m)%n即可,
淘汰2,于是变为0 1 3 4 5,接下来报数顺序为:D)3 4 5 0 1,n=5
第i=3次报数:E)0 1 2 3 4,E变回D,只要(E+m)%n即可
以此类推。。。。
我们可以知道:
第i次淘汰的数可以归纳出下面的递归公式:
f(n,m,i)=[f(n-1,m,i)+m]%n;
当i=1时,f(n,m,1)=(n+m-1)%n;
算法如下
public class LastRemaining { public int LastRem(int n, int m,int i) { if(i==1) return (n+m-1)%n; else return (LastRem(n-1,m,i-1)+m)%n; } public static void main(String[] args) { LastRemaining cls = new LastRemaining(); for(int i=1;i<=7;i++) System.out.println(cls.LastRem(7, 3,i)+1); } }
相关文章推荐
- [读书笔记]高性能js-数据访问
- Java内存回收机制(第一讲)
- 自定义View---怎么解决View的滑动冲突
- Java中的抽象类和接口区别
- HP data protector软件学习2--软件组成与界面介绍
- 关于RSS信息按时间排序的代码
- leetcode-Reverse Bits
- android添加图片到本地,无法即使刷新的解决方法
- Cloud Design Pattern - Compute Resource Consolidation(服务聚合)
- lscpi指令详解
- JAVA微信支付 实现服务端返回预付单号和签名
- 依赖注入
- [hadoop2.7.1]I/O之SequenceFile最新API编程实例(写入、读取)
- 【UI基础】时钟效果的简单实现
- Ubuntu使用教程:E: 无法获得锁 /var/lib/apt/lists/lock - open (11 资源临时不可用)
- iOS 9 适配系列教程
- [C++] const inside class VS const outside class
- 《leetCode》:Valid Parentheses
- 文件管理和归档
- 愤怒的小鸟-物理世界Box2d(3)-刚体碰撞监听