//方法一
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 "<br/>".joseph_ring(60,5)."<br/>";
echo "<br/>".joseph_ring2(60,5)."<br/>";
网友评论