约瑟夫与海盗
** Question**从前,有15个教徒和15个异教徒在深海上遇险,他们逃到一个岛上。没想到祸不单行,又被海盗抓住。残忍并且好赌的海盗头领决定要将一半的人投入海中,并且想了一个办法来决定每个人的生死:将30个人围成1圆圈,从第1个人开始依次报数,每数到9,这个人就将被扔入大海,如此循环,直到仅余15个人为止。教徒的领队约瑟夫(Josephus)是个见多识广的智者,他想了一个好办法,让教徒们站在特定的位置上,这样使得15名教徒最后全都生存下来。请问怎样的排法才能使每次投入大海的都是异教徒?
public static void main(String[] args) {
int arr[]=new int[30];
int count=arr.length;
int num = 0;
int index =-1;
for(int i=1 ; i<=count ; i++) {
arr[i-1]=i;
}
while(count>15){
num++;
index++;
if(num==9){
for(int i=index%count;i<count-1;i++){
arr[i]=arr[i+1];
}
num=0;
index--;
count--;
}
}
for(int i=0;i<count;i++){
System.out.print(arr[i]+" ");
}
}
Before Simplify
After Simplify
public static void main(String[] args) {
int arr[]=new int[30];
int count=arr.length;
int num = 0;
for(int i=1 ; i<=count ; i++) {
arr[i-1]=i;
}
int index=0;
do{
num+=9;
index+=8;
if(num==9){
for(int i=index%count;i<count-1;i++){
arr[i]=arr[i+1];
}
num=0;
count--;
}
}while(count>15);
for(int i=0;i<count;i++){
System.out.print(arr[i]+" ");
}
}