做一道题,自己写的程序老是运行不了,提示:“载入页面时到服务器的连接被重置。”题目:一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号
程序:
function monkey($n,$m){

if($n<2){
return '猴子数不能小于2';
}elseif($m<2){
return '$m不能小于2';
}

//初始化 for($i=1;$i<=$n;$i++){
$monKeys[$i] =$i;
}

$s = kill($m, $monKeys);

print_r($s);
}function kill($m,$monKeys){
if(count($monKeys)==1) return $monKeys;

$cutNum = $m % count($monKeys);//删除第几个
$i=1;
foreach ($monKeys as $key=>$value){//-----------出错在这个foreach里面但找不到原因。求帮忙
if($i==$cutNum){
unset($monKeys[$key]);
break;
}
$i++;
}
return kill($m,$monKeys);
}
monkey(25, 8);----------------
求帮忙!

解决方案 »

  1.   

    $cutNum = $m % count($monKeys);这里没有考虑到0的情况。你的运算逻辑也是错的。function kill($m,$monKeys){
     $arr_l = array();
     $arr_r =array();
     $tot = count($monKeys);
     if($tot==1)return $monKeys;
     
     $i=1;
     if($m > $tot){
      $newm = $m%$tot;
      if($newm==0) $newm = $tot;
      foreach($monKeys as $k=>$v){
    if($newm > $i){
    $arr_r[] = $v;
    }elseif($newm < $i){
    $arr_l[]=$v;
    }else{
    $str =$v;
    }
    $i++;
    }
    }else{
    foreach($monKeys as $k=>$v){
    if($m > $i){
    $arr_r[] = $v;
    }elseif($m < $i){
    $arr_l[]=$v;
    }else{
    $str = $v;
    }
    $i++;
    }
    }

    if(!count($arr_l)){
    $monKeys = $arr_r;
    }else if(!count($arr_r)){

    $monKeys = $arr_l; }else{
     $monKeys =array_merge($arr_l,$arr_r);
      }
      
      echo $str .'  ';
    return kill($m,$monKeys);
    }
      

  2.   

    本帖最后由 xuzuning 于 2011-08-21 06:21:25 编辑
      

  3.   

    按要求,这里 for($i=0; $i<$m; $i++) $ar[] = array_shift($ar);要改成
     for($i=0; $i<$m-1; $i++) $ar[] = array_shift($ar);才行
    不过这种写法才算精彩,佩服!
      

  4.   

    $cutNum = $m % count($monKeys);这里没有考虑到0的情况。
    这个在count($monKeys)==1时就return了呀,不会有0的情况呀。
    我执行了一下你的代码,出来的是一串数字,按题目应该是得出一个数字(号)。
      

  5.   


    得出的结果好像不对呀。比如,monkey(5, 2);的时候,应该得出的结果是1才对,而程序得出的是4
      

  6.   

    首先,echo monkey(5, 2); 得到的是3,而不是4
    其次,请观察
    1,2,3,4,5
    1,2,3,4,5
    1,2,3,4,5
    12,3,4,5
    12,3,45
    你说应该得几?
      

  7.   


    说的也是。谢谢你...!
    我原来的程序是错在$cutNum = $m % count($monKeys);这里没有考虑到0的情况。了。谢谢xuzuning 和 huweiwo