N只猴子要选猴王,方法是,它们围成一圈,从1到M连续报数。凡是报到M时,报该数的猴子就从圈中退出,然后剩下的猴子接着(从退出圈中的猴子后边开始)从1到M报数,直到只剩下一个猴子时,该猴子就是猴王。最后的猴王是N只中的第几只呢?M,N自己输入。
package lianxi;
public class ff {
public static void main(String[] args) {
ff.countMQuit(3,2);
}
public static void countMQuit(int N,int M){
//1先创建一个boolean型的,让每个值 都等于true
boolean[] arr = new boolean[N];
for(int i=0; i<arr.length; i++){
arr[i] = true;
}
//左边的数让它等于等数量
//定义一个数数的变量
// 当数量疏导第M个人的时候 总数量-- 让改数量等于false 从后面的开始数
int leftCount = arr.length;
int countNum = 0;
int index = 0;
while(leftCount > 1){
if(arr[index] == true){
countNum++;
if(countNum == M){
countNum = 0;
arr[index] = false;
leftCount--;
}
}
index++;
if(index == arr.length){
index = 0;
}
}
for(int i=0; i<arr.length; i++){
if(arr[i] == true){
System.out.print("猴王是第"+(i+1)+"只猴子");
}
}
}
}
方法二:用LinkList实现的 理解起来多少有点困难
package lianxi;
import java.util.LinkedList;
public class aaaaa {
public static void main(String[] args) {
LinkedList<Integer> monkeys = new LinkedList<Integer>(){{
for (int i = 1; i <=5; i++)
add(i);
}
};
int count = 5;
int i = -1;
while (count > 1){
int temp = i + 3;
if (temp >= count)
temp = temp % count;
monkeys.remove(temp);//这个是关键,如何准确的 删除掉那个人
count--;
i = --temp;// 先减去后在赋值
}
System.out.println(monkeys.get(0));
}
}
第三版:package lianxi;
import java.util.LinkedList;
import java.util.Scanner;
public class sa {
public static void main(String[] args) {
//创建一个linkList的数组 有 5个元素
Scanner sc =new Scanner(System.in);
final int M =Integer.parseInt(sc.next());
int N =Integer.parseInt(sc.next());
LinkedList<Integer> lk =new LinkedList<Integer>(){
{for(int i=1;i<=M;i++){
add(i);
}}
};
System.out.println(lk);
//while 循环 之后准确的删除掉那个
int mark=-1;//配合着让goal可以正确的被删除
int count=M;
//自己随便假设一个,先写死,在写活
while (count>1){
int goal=mark+N;
if(goal>=count){
goal=goal % count;//越界的话借助这个方法
}
lk.remove(goal);
count--;
mark=--goal;
}
System.out.println("最后的猴子王是:"+lk.get(0));
}
}