描述:
P个人围成一圈,从第N个位置开始从1报数,当报到第M个数的时候,那个喊出第M个数的人被罚下,他的下一个位置继续从1报数,问最后留下的人在哪个位置?
实现方式,利用数组,数组赋值为1,若被淘汰则赋值为0,赋值为0的人下次不参与计算
/**
*
* @param total 共有多少人
* @param start 从第几个人开始计数
* @param step 每次需要几个数
* @return
*/
public static int hanky(int total ,int start,int step){
int[] arr = new int[total];
//数组赋值为1,若数到该人则赋值为0
for(int i=0;i<arr.length;i++){
arr[i] = 1;
}
//开始的位置
int current=start;
//共需循环的次数
int flag=total-1;
while(flag!=0){
int sum=0;
//若累计的数和要数据的数相等,则该轮结束
while(sum!=step){
sum+=arr[current-1];
//若开始位置和总共的人数相等,则从第一个人开始计数
if(current==total){
if(sum==step){
arr[current-1]=0;
}
current=1;
}else{
current++;
}
}
//该轮被淘汰的位置
if(current!=1){
arr[current-2]=0;
}
flag--;
//查看数组变化
for(int j=0;j<total;j++){
System.out.print(arr[j]+" ");
}
System.out.println("-------------------");
}
int j=0;
while(arr[j]==0){
j++;
}
return j+1;
}