7-18 猴子选大王 (20 分)
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(≤1000)。
输出格式:
在一行中输出当选猴王的编号。
输入样例:
11
输出样例:
7
分析:
首先
分析下循环的指针变化情况:
我们发现并没有固定点,总是一个指针反复循环,所以循环只要一层即可,使用什么循环?while/for/do_while?
因为决定循环次数的不是一个元素段,而是猴子的个数,所以这里不适合使用默认的 int i =0 ;i<len ;i++作为下标,
定义指针index,这个指针也有非线性变化情况(到了最后一个数接下来又是第一个数)
分析变量变化情况: (哪些变量是不断变化的)
猴子的个数
报数
设置变量:猴子的个数= remiander ,初始值是total(刚开始猴子的总个数) ,报数= count,初始值是 0(报第一个时便是1)
分析业务关系 (数据处理):
凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数------》count==3 , count =0
import java.util.ArrayList;
import java.util.List;
public class LanQiao_18 {
public static void main(String[] args) {
int N=11;
List<Integer> list=new ArrayList<Integer>();
//初始化队伍
for (int i = 0; i < N; i++) {
list.add(i+1);
}
//猴子的个数
int remiander=N;
//报数器
int count=0;
int i=0;
while(remiander>1){
count++;
if(count==3&&list.get(i)!=null){
list.remove(i);
count=0;
remiander--;
i++;
}
i++;
}
System.out.println(list.toString());
}
}