需求分析:有n个人一起报数,报道数字m的人则退出游戏,然后又重新开始报数,如此循环,最后只剩下一个人则停止报数,输出这个人的位置。
算法设计:
package nine;
public class PaoSJ{
public static void main(String [] argc){
//确定游戏人数,用数组存储
int[] arr=new int[100];
addArr(arr);
System.out.println(circleArr(arr));
}
//给数组赋值
public static void addArr(int [] arr){
for(int i=0;i<arr.length;i++){
arr[i]=1;
}
}
//做循環找到最後剩下的數
public static int circleArr(int[] arr){
int index=arr.length;//要報的數
int i=0;//返回数字序号
int m=0;//循環數
int x=0;//接收最後剩下的人的下標
while(index>1){
//报数
if(arr[i]==1){
m++;
//找到退出的人,退出操作,第一个循环实现
if(m==3){
arr[i]=0;
index--;
m=0;
}
}
i++;
//第二个循环的实现
if(i==arr.length){
i=0;
}
}
for(int j=0;j<arr.length;j++){
if(arr[j]==1){
x=j+1;
}
}
return x;
}
}
这是一个古老的算法问题,其解题思路比较简单。关键是实现两个循环,第一个循环为:找到指定要退出的人后,若剩余的人数大于一,则从1开始数起;第二个循环为:当装人数的这个容器(数组)数到最大值(arr.length)后,将其记录数数的值(i)重新赋值为0,开始新的一轮报数,直到只剩一个人为止。