题目:有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("您的输入有误!"); } } }
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("您的输入有误!"); } } }
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