N只猴子要选猴王,方法是,它们围成一圈,从1到M连续报数

来源:互联网 发布:无人机数据 编辑:程序博客网 时间:2024/05/22 13:19

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));
    }

}










0 0
原创粉丝点击