狐狸捉兔子,約瑟夫,猴子選大王,求剩餘者42

第一題:猴子選大王。

題目:有M個猴子圍成一圈,每個有一個編號,編號從1到M。打算從中選出一個大王。經過協商,決定選大王的規則如下:從第一個開始,每隔N個,數到的猴子出圈,最後剩下來的就是大王。要求:從鍵盤輸入M,N,編程計算哪一個編號的猴子成爲大王

第二題:設有N個人圍成一圏,並且按照順時針方向從1到N編號,由第S個人開始進行從1到M報數,報數到第M個人時,此人出圏,再從下一個人重新開始從1到M報數,如此進行下去,直到所有的人都出圏爲止。現在要求編程按照出圏的順序,打印這N個人的順序表。
第三題:狸捉兔子
•圍繞着山頂有10個洞,狐狸要喫兔子,兔子說:“可以,但必須找到我,我就藏身於這十個洞中,你從10號洞出發,先到1號洞找,第二次隔1個洞找,第三次隔2個洞找,以後如此類推,次數不限。”但狐狸從早到晚進進出出了1000次,仍沒有找到兔子。問兔子究竟藏在哪個洞裏?
參考題目250枚棋子圍成圓圈,編上號碼1,2,3,…每隔一枚棋子取出一枚,要求最後留下的一枚棋子的號碼是42,那該從幾號棋子開始取呢?



java實現,具體見代碼:總共5個類(狐狸捉兔子單獨)

一個封裝的類:OneTwoClass

import java.util.LinkedList;
import java.util.List;

public class OneTwoClass {
	/**
	 * 
	 * @param m
	 *            代表總數
	 * @param n
	 *            代表第幾個淘汰,出場
	 * @param flag
	 *            1代表第一題,2代表第二題
	 * @param S
	 *            代表從第幾個開始
	 */
	int  findPeople(int m, int n, int flag, int S) {
		List<Integer> target = new LinkedList<Integer>(); // 創建一個整形列表
		for (int i = 0; i < m; i++) { // 初始化列表,0號放1,1號放猴子2,,m-1號放最後一隻猴子
			target.add(i + 1);
		}
		int point = 0;
		int index = 1; // 標誌淘汰猴子標誌,當Index等於n時出場
		if (flag == 1) // flag == 1時,代表第一題
			point = 0; // 下標標誌
		else if (flag == 2) // 當flag == 2時,代表第二題,下標從S-1開始
			point = S - 1;
		while (target.size() > 1) { // 當還有兩隻猴子以上時
			index++; //
			if (point >= target.size() - 1) // 達到尾部,重新返回初始指針處
				point = 0; // 下標又從0開始
			else
				point++;

			if (index == n) { // 判斷是否是要出場的猴子
				index = 1; // 淘汰猴子標誌
				if (flag == 1)
					target.remove(point); // 移除該猴子
				else if (flag == 2) { // 第二題需要打印出來
					System.out.print("  " + target.get(point));
					target.remove(point);
				}
				if (point > target.size() - 1) // 該處是爲了防止移除最後一項而指針未能移到初始處而引起的exception
					point = 0;
			}
		}
//		if (flag == 1)
////			System.out.println("最後猴子大王是 : " + target.get(0) + " 號");
//
//		else if (flag == 2) {
//			System.out.println("  " + target.get(0));
//		}
		return target.get(0);
	}
}



第一題的測試類:MonkeyTest


import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class MonkeyTest {

	public static void main(String[] args) {
		OneTwoClass mokey = new OneTwoClass();
		Scanner s = new Scanner(System.in);
		System.out.println("請輸入猴子總數M:");
		int M = s.nextInt();
		System.out.println("請輸入出場隔數N(第N個出場):");
		int N = s.nextInt();
		if (M >= 1 && N > 0){
			int last = mokey.findPeople(M, N , 1 , 1);
			System.out.println("最後猴子大王是 : " + last + " 號");
		}
		else {
			System.out.println("您的輸入有誤!");
		}
	}

}

第二題的測試類:TwoTest


import java.util.Scanner;

public class TwoTest {
	public static void main(String[] args) {
		OneTwoClass people = new OneTwoClass();
		Scanner s = new Scanner(System.in);
		System.out.println("請人總數	N:");
		int N = s.nextInt();
		System.out.println("請輸入第幾個人開始S:");
		int S = s.nextInt();
		System.out.println("請輸入到第幾個人淘汰 M:");
		int M = s.nextInt();
		if (N >= 1 && M > 0 && S >= 1) {
			System.out.println("出場順序依次是:");
			int last = people.findPeople(N, M, 2, S);
			System.out.print(" " + last);
		} else {
			System.out.println("您的輸入有誤!");
		}
	}
}

第四題的測試類:FourTest


import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class FourTest {

	public static void main(String[] args) {
		OneTwoClass thread = new OneTwoClass();
		/*
		 * 第一個參數代表50人,第二個參數代表每2個人開始取出,第三個參數flag代表用猴子式,
		 * 第四個參數代表假如從1號開始算,即從2號開始取出,
		 */
		int last = thread.findPeople(50, 2, 1, 1);  
		int result =( (42 - last + 1 + 50) % 50 + 1);		
		//((1號 -1號返回的結果 + 42)% 50)但1號代表的是從一號開始數,從2號開始取出,故而加1
		System.out.println("若要使50人中最後剩下第42人,則需從第 " + result + "號開始取出!");
		
	}
}
結果:

若要使50人中最後剩下第42人,則需從第 7號開始取出!

第三題:狐狸捉兔子

ThreadClass


public class ThreadClass {
	public static void main(String[] args) {
		int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // 洞
		int i, j, k;
		for (i = 1, j = 1; i <= 1000; j = j + i) { // i代表狐狸查找總次數
			if (j > 10) // 當大於10時求餘數
				j = j % 10; // 循環
			for (k = 0; k < 10; k++)
				if (a[k] != 0)	//避免已經置爲0的洞再次置爲0
					if (j == a[k])// 狐狸經過的洞置0
						a[k] = 0;
			i++;
		}
		System.out.println("兔子在的洞:");
		for (k = 0; k < 10; k++)
			// 不爲0就是狐狸沒找的洞
			if (a[k] != 0)
				System.out.print(" " + a[k]);

	}
}

結果:

兔子在的洞:
 2 4 7 9



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章