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