日期:2014-05-20  浏览次数:20608 次

java编程疑问
我还是一个初学者,最近遇到一个问题很是难解,下面是所求问题,要求用java求解:十五个猴子围成一个圈,一次1-7循环报数,报到7的猴子被淘汰,知道最后一只猴子成为大王。问,哪只猴子最后能成为大王?望能详解并且附上源代码,谢谢!!!

------解决方案--------------------
就是约瑟夫环的问题.参考一下:
http://topic.csdn.net/u/20120627/20/4f300b35-b616-4d3d-8a22-e5313f9fc3cb.html?97837
------解决方案--------------------
楼主学过数据结构没有,初学者应该先考虑算法,然后再考虑具体语言的编程方法。

比如看到这个题目,就应该先考虑用循环链表之类的数据结构来实现这“十五个猴子围成一个圈”,然后从首届点开始依次找下一个节点,逢7将该节点删除。

最后才是想想如果用Java开发,有没有循环链表可供使用?如果没有能不能用其它啥来模拟下?



上来就求源码,对自己帮助真的很大么?
------解决方案--------------------
同意楼上所见
------解决方案--------------------
楼主,建议你培养面相对象的思维,把猴子看成对象,圈也是一个对象,考虑下类之间的关系
------解决方案--------------------
int i=0;
while(l.hasNext()){
i++;
if(i==3){
System.out.println("排除"+l.next());
l.remove();
i=0;
}else{l.next();}
}
if(ll.size()<=1){
System.out.println("最终结果是"+l.next());
}else{
test(l);
}
------解决方案--------------------
Java code
public class Monkey {
    //all代表围成圈的个数,interval代表报数间隔
    public static void last(int all, int interval) {
        //初始化
        boolean[] flag = new boolean[all];
        for (int i = 0; i< all; i++)
            flag[i] = true;
        
            
        int i = 0, j=0; //i代表所有人数的位置,j计数,代表1到interval
        int end = all;    //记录剩余的人数,初始化为all
        
        //只要剩余的大于 ,就一直循环
        while (end > 1) {
            if (flag[i]) {            //从没有退出圈子的开始报数
                j++;
            }
            if (j == interval) {    //如果计数等于interval,就退出圈子    
                j = 0;                //j重新计数
                flag[i] = false;    //退出圈子,标记
                end--;                //剩余个数减1
            }
            i++;
            if (i == all) i=0; //一遍循环结束后,i归0,从头开始
        }
        
        for (int k=0; k< all; k++) {
            if (flag[k]) 
                System.out.println("大王的位置为: " + (k+1));
        }        
    }
    
    public static void main(String[] args) {
        last(15,7);
    }
}