1. 程式人生 > >約瑟夫環簡介,問題以及java實現

約瑟夫環簡介,問題以及java實現

問題:一群猴子排成一圈,按1,2,…….,n依次編號。然後從第一隻開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,再把它踢出去………………….,如此不停的進行下去,直到最後只剩下一隻猴子為止,那隻猴子就叫做大王。要求:輸入m,n,輸出最後的那個大王的編號。
很明顯,這是一個約瑟夫環的問題,它的特徵如下:
1、一群人圍在一起坐成環狀(例如N個人)
2、從某個編號開始報數(如:K)
3、數到某個數(如:M)的時候,此人出列,下一個人重新報數
4、一直迴圈,直到所有人出列[3] ,約瑟夫環結束

知道了它的原理,那麼我們解決起來也就有針對性了。程式碼如下:

import
java.util.ArrayList; import java.util.List; import java.util.Scanner; public class josephus { /** * @param args */ public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("請輸入總的數目:"); int totalNum = sc.nextInt(); System.out.println("請輸入報數的編號:"
); int cycleNum = sc.nextInt(); jsoephus_func(totalNum,cycleNum); } private static void jsoephus_func(int totalNum, int cycleNum) { //定義連結串列 List<Integer> list = new ArrayList<Integer>();//初始的人數 List<Integer> resultlist = new ArrayList<Integer>();//點到人
for(int i=1;i<=totalNum;i++){//把所有的猴子的編號都儲存到連結串列中去 list.add(i); } int count = 0; for(int j =0;j<totalNum;j++){ count = (--count+cycleNum)%list.size(); //System.out.print(list.get(count));//將選中的每一個猴子的編號都打印出來 resultlist.add(list.remove(count));//將點到的每一個猴子的編號都儲存到連結串列中,最後一個即是我們想要的答案 } System.out.println(resultlist.get(resultlist.size()-1));//打印出最後一個點到猴子的編號 } }

結果顯示如下:
這裡寫圖片描述

說明:
輸入8,表示總共有8只猴子,輸入2,表示踢出猴子的編號是從2開始的。
首先是編號為2的猴子,然後是編號4,編號6,編號8,編號3,編號7,編號5,最後剩下的就是編號1了。
可以把整個踢出過程打印出來,顯示如下:
這裡寫圖片描述

當然啦,這個也可以用遞迴來做。具體怎麼做,這裡就不在介紹了,若有興趣,可自行百度。