7-18 猴子选大王

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());
        
    }
}
 

猜你喜欢

转载自blog.csdn.net/qq_35394891/article/details/83268228