1. 程式人生 > >7-18 猴子選大王

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