/**
* m只猴子围成一圈报数,报n的猴子离开,再从1开始,求最后那只猴子的初始位置
* @author HuWT
*/
public class P00_猴子选大王 {
public static void main(String[] args) {
final int m=15,n=3;
int[] mk=new int[m];
/* 猴子指针 i //指出猴子编号,从0开始到m-1
* 猴计数器 t //指出被淘汰的猴子
* 淘汰计数器 count
*/
int i=0,t=1,count=0,king=0;
while (true) {
while(mk[i]==1) {i++;i%=m;} //跳过被淘汰的猴子,校正 猴子指针
if(t==n){mk[i]=1;t=1;count++;} //标记淘汰的猴子,复位猴子计数器 t,淘汰数++
//当淘汰的猴子数==猴总数-1 时,本次循环为 最后一次循环
if(count==m-1) {System.out.println("猴王是: "+king+"号猴");break;}
if(t==n-1){king=i+1;} //当t==n-1时,第n只候被淘汰,猴王就是 最后一次循环 中的n-1只猴(king=i+1 是为了符合习惯,将猴子从1开始编号,而不是0)
while(mk[i]==1){i++;i%=m;} //跳过被淘汰的猴子,校正 猴子指针
i++;t++;i%=m; //移动 猴子指针,猴子计数器++,校正 猴子指针 i
}
}
}