国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

約瑟夫問題

2019-11-11 00:06:06
字體:
來源:轉載
供稿:網友

網上找的約瑟夫問題的代碼,自己理解了一遍,多加了一些注釋。方便以后復習

據說著名猶太歷史學家 Josephus有過以下的故事:在羅馬人占領喬塔帕特后,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧愿死也不要被敵人抓到,于是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然后再由下一個重新報數,直到所有人都自殺身亡為止。然而Josephus 和他的朋友并不想遵從。

首先從一個人開始,越過k-2個人(因為第一個人已經被越過),并殺掉第k個人。接著,再越過k-1個人,并殺掉第k個人。這個過程沿著圓圈一直進行,直到最終只剩下一個人留下,這個人就可以繼續活著。問題是,給定了和,一開始要站在什么地方才能避免被處決?Josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,于是逃過了這場死亡游戲。

	/**	 * 實現約瑟夫問題的方法	 * @param sum 總人數	 * @param n 報數報到n的人自殺	 */	public static void get(int sum, int n) {				//將人數放到List集合中方便刪除指定元素,指定元素就表示被殺死的人		List<Integer> strs= new ArrayList<Integer>();		for (int i = 0; i < sum; i++) {			strs.add(i + 1);		}				int i=0; //下標	    while (strs.size() > 1) {	    		    	/*	    	 * 數到n的數字移出去。當一個人數到n,就將他的下標設置成0,并刪除它	    	 * 這樣他的下一個數就會自動往前移動,下標變為0	    	 */	    	if(n==i+1){	    		i=0;//重新開始數	            System.out.PRintln("每次死去的人:"+strs.remove(i));	        }	    		    	//把第一個移動到最后一個,就相當于跳過了一個人。如果沒有執行if語句,就相當于把跳過的第二個人移到了最后	        strs.add(strs.remove(0));	        i++; //跳過第二個人	        	    }	    System.out.println("最后活著的人:"+strs.remove(0));//輸出最后一個數字	}}

注意:

List每remove掉一個元素以后,后面的元素都會自動向前移動。

remove方法會返回被刪除的元素。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金坛市| 呈贡县| 赫章县| 孟连| 鹿邑县| 宜兴市| 黄平县| 兰州市| 呈贡县| 古浪县| 福鼎市| 鄂温| 建湖县| 兖州市| 寻甸| 武清区| 景谷| 新营市| 略阳县| 黄骅市| 连南| 泸水县| 南召县| 北辰区| 措勤县| 梁山县| 惠东县| 新竹县| 馆陶县| 新民市| 台州市| 上饶县| 华安县| 青铜峡市| 林甸县| 金乡县| 囊谦县| 砀山县| 花莲市| 南澳县| 土默特左旗|