| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1260 人关注过本帖
标题:请高手解决猴子选大王问题
只看楼主 加入收藏
wz5615
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:12
专家分:121
注 册:2009-7-14
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
请高手解决猴子选大王问题
M只猴子选大王
M只猴子选大王,方法:所有猴子按1……M编号围成一圈,从第一个开始按顺序1,2,3报数,报到3的退出,如此循环,直到最后一只,那只就是猴王。
搜索更多相关主题的帖子: 猴子 大王 
2009-07-14 21:53
编程之星
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:285
专家分:391
注 册:2007-4-10
收藏
得分:0 
问题描述得好像不是清楚。产生了两种歧义:
1.第一个开始按顺序1,2,3报数,报到3的退出,然后再从第1个猴子重新按顺序往下数。
2.第一个开始按顺序1,2,3报数,报到3的退出,然后接着第3个猴子后面(4)的按顺序往下数,从1重新开始数(此时原来的第4个猴子被数做1)。

怎么越学就觉得自己越笨
2009-07-17 02:43
hell_liul
Rank: 2
等 级:论坛游民
帖 子:29
专家分:57
注 册:2009-6-11
收藏
得分:5 
下例用list存储姓名,看谁剩到最后一个

import java.util.ArrayList;
import java.util.List;

public class Helloworld {
 public static void main(String args[]) {
  List list = new ArrayList();
  list.add("1");
  list.add("2");
  list.add("3");
  list.add("4");
  list.add("5");
  list.add("6");
  list.add("7");
  // System.out.println(list);
  Helloworld test = new Helloworld();
  test.aa(list, 0, 4);
 }

/*num为数到几报数*/

 public void aa(List list, int mod, int num) {
  int count = 0;
  int size = list.size();

  for (int i = 0; i < size; i++) {
   if (list.size() == 1) {
    System.out.println(list);
    return;
   }
   if ((i + 1 + mod) % num == 0) {

//关键,因为list的size是变的
    list.remove(i - count);
    count++;
   }
   if (i == size - 1) {

//关键
    mod = size % num + mod;
    this.aa(list, mod, num);
   }
  }
 }
}
/*
list用数组代替,remove用splice代替
以上是一个java写的
用了递归算法
*/
2009-07-17 13:48
hell_liul
Rank: 2
等 级:论坛游民
帖 子:29
专家分:57
注 册:2009-6-11
收藏
得分:2 
想法感觉有点笨,如有错误和其他想法,请帮指正。

我的思路是:
1,首先递归调用,
2,注意递归调用的条件:所有人都输过一遍,数到最后一个进行递归。
3,传递的参数:list是有多少个猴,也可以规定为猴子的名字,
               num满足剔除的条件,这里为3
               mod本次将说有的猴子输过之后,最后一个数到几
                       例如,1,2,3,4 数一遍之后,数到4是为1,那么第二遍数
                            为从1开始。
4,关键参数mod,本次长度与上次的mod有关
5,关键2,list.remove(i - count);剔除的时候,之前已经删除过了,位置定位要注意,和本次删除的个数有关
2009-07-17 14:00
编程之星
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:285
专家分:391
注 册:2007-4-10
收藏
得分:13 
花了一点时间思考才写出来的。由于采用遍历数组作为while循环的条件表达式,所以开销较大,应该可以优化的.
程序代码:
<script>
//假设7个猴子围成一圈.将7个猴子存储在一个数组中
var arr=new Array(7);
arr[0]=1;
arr[1]=2;
arr[2]=3;
arr[3]=4;
arr[4]=5;
arr[5]=6;
arr[6]=7;
//数组最大下标
var arrlen=arr.length-1;
//检测数组是否还剩一个不为0的元素值,0表示该猴子已退出
function remainOne()
{
  var count=0;
  for(i=0;i<arr.length;i++)
  {
    if(arr[i]!=0)
    {
      count++;
    }
  }
  if(count==1)
  {
    return false;
  }else{
    return true;
  }  
}

var k=0;
var m=0; //m为数组的动态下标
//不断循环数猴子一直数到剩下一个为止
while(remainOne())
{
  if(arr[m]!=0)
  {
    ++k;
  }
  //当k=3时表示数到第三只猴子,则该猴子退出
  if(k==3)
  {
    //将k重置为0,重新开始数
    k=0;   
    //该位置的猴子退出 
    arr[m]=0;
  }  
  m++;
  //如果m超出了最大的数组下标,则从最小下标重新开始
  if(m>arrlen)
  {
    m=0;
  }  
}
for(i=0;i<arr.length;i++)
{
  if(arr[i]!=0)
  {
    alert("猴王是:"+arr[i]);
  }
}
</script>

" border="0" />

怎么越学就觉得自己越笨
2009-07-17 22:48
快速回复:请高手解决猴子选大王问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.053452 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved