算法一: 巧妙的算法,具体原理有待补充
int Josephus(int M,int N){
//总人数 M ,数到第 N 个排除。
int i,k;
for(i=2,k=0;i<=M;i++)
k=(k+N)%i;
return ++k;
}
算法二: 经典算法
public class Josephas
2 {
3 //从第start人开始计数,以alter为单位循环记数出列,总人数为total
4 public int [ ] Jose(int total, int alter, int start)
5 {
6 int i, j, k = 0;
7
8 //count数组存储按出列顺序的数据,以当结果返回
9 int[] count = new int [ total+1];
10
11 //s数组存储初始数据
12 int[] s = new int [ total+1];
13
14 //对数组s赋初值,第一个人序号为0,第二人为1,依此下去
15 for (i = 0; i <total; i++)
16 {
17 s[i] = i;
18 }
19
20 //按出列次序依次存于数组count中
21 for (i = total; i >= 2; i--)
22 {
23 start = (start + alter - 1) % i;
24 if (start == 0)
25 start = i;
26 count[k] = s[start];
27 k++;
28 for (j = start + 1; j <= i; j++)
29 s[j - 1] = s[j];
30 }
31
32 count[k]=s[1];
33
34 //结果返回
35 return count;
36 }
37 }
注:算法来源于网络..