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