您的位置:首页 > 其它

约瑟夫环

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 … N

k = 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: