约瑟夫环
2016-03-26 20:39
232 查看
题目描述
有N个人围成一圈,从第一个开始报数,当报到m,就删除,以此循环,求最后一个剩下的数字题目解答
1. 标记法
public static void main(String[] args) { //约瑟环 //用数组来模拟环 //30个人 boolean[] usaJapan = new boolean[30]; for(int i = 0; i < usaJapan.length; i++) { usaJapan[i] = true; } int leftCount = usaJapan.length; int countNum = 0; int index = 0; //只保留一个人 while(leftCount != 1) { if(usaJapan[index]) { countNum++; if(countNum == 9) { countNum = 0; usaJapan[index] = false; leftCount--; } } index++; if(index == usaJapan.length) index = 0; } for(int i = 0; i < usaJapan.length; i++) { System.out.println((i+1) + "=" + usaJapan[i] + " "); } }
2. 重新映射
1 2 3 4 … Nk = m % N;第一个删除的数
k+1 … N 1 … k-1
映射为:
1 … N-k N-k+1 … N-1
p−1(x)=(x+k)%Np^{-1} (x) = (x+k) \% N
所以
f(n,m)=[f(n−1,m)+m]%Nf(n, m) = [ f(n-1, m) + m ] \% N
int lastRemaining(int n, int m) { if(n < 1 || m < 1) return -1; int last = 1; for(int i = 2; i <= n; i++) { last = (last + m) % i; if(last == 0) last = i; } return last; }
相关文章推荐
- 数组系列练习二
- 数据的特性与关系
- MFC之CSerialPort类双串口发送接收
- 数据字典
- 浙江科技学院第十三届程序设计竞赛 1001:Let's go to play【细心】
- 第四周项目5--用递归方法求解(3)
- MySQL存储引擎--InnoDB
- 消隐
- bzoj4244 邮戳拉力赛 动态规划
- 关联引用的使用方法
- 展示图片的自动和手动切换
- 矩阵快速幂 ZOJ 3497 Mistwald
- 表空间
- 异常处理方法
- json 数组对象 取值
- 常见图表元素
- Android开源库
- 【BZOJ1005】【HNOI2008】明明的烦恼
- Wolfram Mathematic流程控制
- 比较经典的中断串口接收方法