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