猴子选大王—Java单数组、map、数学计算实现

来源:互联网 发布:continue在c语言 编辑:程序博客网 时间:2024/06/06 02:40

        好久没有登录CSDN写东西了,真的是好久了,原因很简单,因为自己松懈了好久,懒惰了好久。以前要求自己每天一篇,那时候虽然算不得勤奋,最起码没有放弃学习。以后要慢慢恢复自己的学习状态。毕竟找工作难找啊,今天到用友的小分部看了看,主管大讲特讲的讲了很多,工作难找啊。

        今天要写的是猴子选大王小程序,这是一个很经典的考题。有M只猴子彼此不服气都想争夺当猴王,打一架强者为王当然行,但和平静气的解决才是王道,解决办法就是猴子们站成一个圈,从1开始报数,每数到规定的N则将第N个猴子淘汰,然后继续从1报数继续按规则淘汰,剩着为王嘛,最后剩下的猴子就是猴王,这样各凭运气,听天之命谁也不要抱怨。问题知道了,想法缕顺了,怎么开始编程呢?

        其实最简单的方法就是用一个循环链表,每次到第N个猴子remove()掉一个猴子,思路简单,代码少(代码后面会贴出),问题是List的好多语法忘记了咋办,那就用最简单的直接单数组实现。

        那么问题来了,用数组怎么实现呢?将编号存在数组里,将下标当做报出的数字进行移动,下标从0开始,然后每到N时,将数组内的编号变为0,然后继续从0开始移动,当到数组末位的时候返回最前面开始数,当遇到编号为0的猴子时候,表示给猴子已经淘汰,跳过该猴子下标继续移动。

         写了这么多汉字就知道这是比较笨的办法,最麻烦的就是条件的编写,哎,好久没接触Java,目前水平也就这样了。以下是具体代码:

public class monkey {/* * 猴子选大王,首先输入猴子数目,然后规定喊出的数字,最后确定哪个猴子是大王 */public static void main(String[] args) {//输入猴子的数目int num[] = new int[10];for(int a=0;a<10;a++){   //给数组赋值num[a]=a+1;}//规定喊出的数字5int law = 5;System.out.println("输入猴子的数目:10");System.out.println("规定数字:5");select(num,law);  //根据规定选择大王}static void select(int num[],int law){int king=0;int index=1; //记录数组下表int count=1;//第一个猴子从一开始数int left=10;while(left!=0){  //然后依次向下数if(index==num.length+1){  //如果数到末位则返回重新数index=1;}if(count==law&&num[index-1]!=0){   //当数到规定的数之后,猴子数量减一,继续从头开始数num[index-1]=0;left--;count++;if(count==law+1)  count=1;}if(num[index-1]!=0){count++;if(count==law+1)  count=1;}index++;}System.out.println("最后的猴子大王是:"+--index);}}
       程序里面的注释已经很清楚了。运行结果是:


      这个单数组的是比较笨的办法,我把其他的方法也贴出来,思路大家一看就都知道了。

      

private static void method2(int n,int a) {Map map = new HashMap();int p = 1; // 猴子编号int c = 1; // 报数号for (int i = 1; i < n + 1; i++) {map.put(i, i);}while (map.size() > 1) {if (c == 3) {map.remove(p);}p++;if (p == n + 1) {p = 1;}if (map.get(p) != null) {c++;}if (c == a + 1) {c = 1;}}String result = map.keySet().toString();System.out.println("猴王的编号为:"+result.substring(1, result.length()-1));}
       这个是用到map的方法,传递的参数n表示猴子的数量,a表示规定的数字,每数到3的时候remove() 掉一个猴子,每次到map结尾的时候,回环继续报数。

         最后这个简单的方法就是纯数学的推理了。

public static void method3(int a, int n) {int index = 0;for (int i = 2; i <= a; ++i) {index = (index + n) % i;}System.out.println("猴王的编号为:"+(index+1));}

1 0
原创粉丝点击