PHP解决约瑟夫环问题

//方法一
function joseph_ring($n,$m){
    $arr = range(1,$n);
    $i = 0;
    while(count($arr)>1){
        $i=$i+1;
        $head = array_shift($arr);//先拿出来做判断,符合删除,不符合插入后面。保证环
        if($i%$m != 0){ //如果不是则重新压入数组
            array_push($arr,$head);//往后面补,代表报过数
        }
    }
    return $arr[0];
}
// 方法二
function joseph_ring2($n,$m){
    $arr = range(1,$n);
    $i = 1;
    while(count($arr)>1){
        foreach($arr as $k=>$v){
              if($i == $m){
                    unset($arr[$k]);
                    $i = 1;
              }else{ 
                    $i += 1;    
              }
        }
    }
    return array_values($arr)[0];
}
//方法三
function joseph_ring3($n,$m){
    $r = 0;
    for($i=2;$i<=$n;$i++){
        $r = ($r+$m)%$i;
    }
    return $r + 1;
}
echo "
".joseph_ring(60,5)."
"; echo "
".joseph_ring2(60,5)."
";

你可能感兴趣的:(PHP解决约瑟夫环问题)