程序选猴子123
 山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,
凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。 
大家来试试

解决方案 »

  1.   


    <?
    $m=10;
    $n=1;
    $arry_m=range(1,$m);
    for($i=1;$i<=($m-1);$i++)
    {
    $a=count($arry_m);
    echo $a;
    if($a>=$n)
    {
    array_splice($arry_m,$n-1,1);
    print_r($arry_m);
    echo "<br>";
    }
    if($a<$n)

    if(($n-$a)>$a)
    {
    $c=(int)($n/$a);
        array_splice($arry_m,$n-$a*$c-1,1);//这个地方有问题
        print_r($arry_m);
        echo "<br>";
    }
    else 
    {
    array_splice($arry_m,$n-$a-1,1);
        print_r($arry_m);
        echo "<br>";
    }
    }
    }
    print_r($arry_m);
    ?>今天花了一早上 用PHP写的! 不知道对不对!
      

  2.   

    是挺好玩,那时候给一个小巧4,5行就解决问题的代码震住了,一查才知道是道给研究了很透彻的算法题.
    google->约瑟夫环数学解法
      

  3.   


    //yangyu$M = 10;
    $N = 3;for($i = 0; $i <= $M; $i++){
    $array[$i]['nextnum'] = ($i==$M) ? 1 : $i+1;
    $array[$i]['num'] = $i;
    }$count = 0;
    $h = $M;
    printf("依次退出的猴子: \n");
    while($count < $M-1){
    $i = 0;
    while($i != $N){ 
    $h = $array[$h]['nextnum'];
    if($array[$h]['num']) $i++;
    }
    printf("%4d",$array[$h]['num']);
    $array[$h]['num'] = 0;
    $count++;
    }
    $result = array_values(array_filter($array,create_function('$a', 'return $a["num"];'))); 
    printf("\n大王是:%3d\n",$result[0]['num']);
      

  4.   

    修改不了帖子了,有个地方需要改下

    for($i = 0; $i <= $M; $i++){
    改成
    for($i = 1; $i <= $M; $i++){
      

  5.   

    知写了一个,看这个是不是对的,代码写得不精简$num        = 11;$numarray   = array();
    for( $i = 0;  $i < $num; $i++ ) {
        $numarray[$i]   = $i+1;
    }
    test2($numarray, 1);
    function test2($numarray, $k){
    $sign       = 5;
    $k          = $k;
    foreach( $numarray as $key => $value ) {
        if ( $k % $sign == 0 ) {
            $newnum     = $key;
            $temparr    = $numarray;
            unset($numarray[$key]);
            if ( $key != max(array_keys($temparr)) ) {
                $k = 1;
                continue;
            }else{
                if ( !empty($numarray) ) {
                    $key = max(array_keys($numarray));
                }
                $k   = 1;
                if ( count($numarray) == 1 ) {
                    print_R($key);
                    exit;
                }
                test2($numarray, $k);
            }
        }else{
            if ( $key == max(array_keys($numarray)) ) {
                $k++;
                test2($numarray, $k);
            }
            if ( count($numarray) == 1 ) {
                print_R($numarray[$key]);
                exit;
            }
        }
        $k++;
        }
    }
    exit; 
      

  6.   

    用php写就太简单了。用一个数组,出一个就unset一个,个人想法。然后只有一个的时候退出循环。
      

  7.   


    while(true) {
    $m++; $x++;
    $len = 10;
    $n = 3;
    $m = $m>$len ? 1 : $m;
    if(in_array($m, ($tmp ? $tmp : array()))) continue;
    if(count($tmp)==($len-1)) {echo '大王的编号: ', $m; break;} 
    $i = $i>=$n ? 1 : ++$i;
    if($i==$n) {
    $tmp[] = $m;
    }
    }
    PHP的。 意淫下!O(∩_∩)O
      

  8.   

    复制过来一个 约瑟夫环 的数学解法,看了真是超震撼,竟然一个循环就解决了,4行代码
    int fun(int n, int m)
    {
        int i, r = 0;
        for (i = 2; i <= n; i++)
            r = (r + m) % i;
        return r+1;
    }
      

  9.   


    $n=1000;
    $q=array();
    for($i=0;$i<$n;$i++)
        $q[$i] = ($i+1);
    $j=0;
    for(;;)
    {
        $qq=array();
        for($i=0;$i<count($q);$i++)
        {
            if(count($q)==1)
            {
                echo $q[0];die;
            }   
            if($j==8)
            {
                $j=0;
                continue;
            }   
            $qq[]=$q[$i];
            $j++;
        }   
        $q=$qq;
    }