注册 登录
编程论坛 PHP技术论坛

看到一道题,大家都来算算

风月_无边 发布于 2010-11-25 10:29, 1353 次点击
由1-2000,从1开始隔一取数,将取得的数除去,问最后能剩余的数是几,经过几次能得到这个数。  用php怎么写出来

10 回复
#2
gupiao1752010-11-25 23:12
有点像约涩夫环的问题。思路类似,有意思,帮顶!
#3
gupiao1752010-11-27 21:22
没有装PHP平台。用JS试着写了一个。不过感觉很困惑,大家参考下:
<script type="text/javascript">
var arr=[];
var str="";
var k;
for(var i=0;i<2000;i++)
{
  arr[i]=i+1;
}
function findz(brr){
   for(var j=0;j<brr.length;j++)
   {
    if(brr.length=1){return brr[0];}//如果数组最后只有一个元素了。直接返回!
    if(j%2!=0){brr[j]="";}//畸数位清空!
    str+=brr[j]+",";      //组合一次!
     }
     findz(str.split(",,"));//递归调用自己!
}
 document.write(findz(arr));
</script>

#4
gupiao1752010-11-28 15:02
我终于知道楼主的意思了,我忽略了一个步骤!继续思考代码!到时候再补出来!
#5
风月_无边2010-11-29 09:20
看似简单的问题, 真正动手去做,就会发现有新的问题了,
#6
asmdaydream2010-11-29 16:03
程序代码:
<?php
$arr = range(1,2000);
$loop_for_start =0;  //用于找开始的那个数
$left = 2000;        //表示还剩下的数
$times =0;           //循环次数
$last = 0;           //最后一个
while($left>1)
{   
    $loop_for_start=0;
    while($arr[$loop_for_start]==0 && $loop_for_start<2000)
    {
        $loop_for_start++;
    }
    print($loop_for_start." ....  ");
    //得到开始的位置了,开始循环
    $arr[$loop_for_start]=0;
    //print('$arr['.$loop_for_start."]=".$arr[$loop_for_start]);/////////////////////////////
    $left--;
    while($loop_for_start<2000 && $left>1)
    {
        //得到后面一个
        $loop_for_start++;
        while($arr[$loop_for_start]==0 && $loop_for_start<2000)
        {
            $loop_for_start++;
        }
        //再取后面一个,隔一除去
        $loop_for_start++;
        while($arr[$loop_for_start]==0 && $loop_for_start<2000)
        {
            $loop_for_start++;
        }
        //如果不为0就可以删除了
        if($arr[$loop_for_start]!=0){
            $arr[$loop_for_start]=0;
            $left--;
        }
    }
    $times++;
}
print($times."次..\n");
//找下最后一个
$loop_for_start=0;
while($arr[$loop_for_start]==0 && $loop_for_start<2000){
    $loop_for_start++;
}
if($loop_for_start==2000){
    print('失败');
} else {
    print('最后剩下'.$loop_for_start."\n");
}

?>

输出的前面几个是每次循环的开始位置,由于直接使用的数组,效率非常低
0 .... 1 .... 3 .... 7 .... 15 .... 31 .... 63 .... 127 .... 255 .... 511 .... 10次.. 最后剩下1023
#7
asmdaydream2010-11-29 16:04
不知道我对题的理解对不对
#8
lyl1986592010-12-06 14:21
有意思,很开发思维
#9
pipiku2010-12-06 16:14
学习一下
#10
风月_无边2010-12-06 16:53
递归实现,思路类似
function getRand($arr){
    if(count($arr)!=1){
        $i = 0;
        foreach ($arr as &$a){
            
            if($i%2 == 0){
                unset($arr[$i]);
            }
            $i++;
        }
        $arr = array_values($arr);
        return getRand($arr);
        
    }else{
        return $arr;
    }
}
$arr = range(1,2000);
$re = getRand($arr);
print_r($re);
#11
gupiao1752010-12-07 00:17
根据楼上的模式,用JS重写了一个,不过我的结果跟你们不同的!
<script type="text/javascript">
 var arr=[];
for(var i=0;i<5;i++)
{
  arr[i]=i+1;
}
function findz(brr)
{
  if(brr.length!=1)
     {
       for(var j=0;j<brr.length;j++)
          {
           if(j%2==0){
                brr=brr.slice(0,j).concat(brr.slice(j+1,brr.length));
                      }
          }
       return findz(brr);
     }
  else
     {
      return brr;
      }
}
document.write(findz(arr));
</script>
我最后的结果是1598
1