猴子选大王
2020-05-14 本文已影响0人
面朝大海春暖花开_ee35
一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。用程序模拟该过程。
分析
- 首先将猴子1-n编号,放入数组中
- 然后进行循环,循环到设定的m编号,从数组删除
- 没有到编号的猴子,先将其压入数组尾部,然后将其原来的位置编号删除
- 直到只剩一个猴子,就是答案
<?php
function monkeyKing($n, $m){
$monArr = range(1, $n);
var_dump($monArr);
$i = 0;
for($i = 0;count($monArr) > 1; $i++) {
#echo $i.PHP_EOL;
if (($i + 1) % $m == 0){
unset($monArr[$i]);
} else {
array_push($monArr, $monArr[$i]);
unset($monArr[$i]);
}
var_dump($monArr);
}
#while(count($monArr) > 1) {
# if (($i + 1) % $m == 0) {
# unset($monArr[$i]);
# } else {
# array_push($monArr, $monArr[$i]);
# unset($monArr[$i]);
# }
# var_dump($monArr);
#$i++;
#}
return current($monArr);
}
$num = monkeyKing(5, 2);
echo "大王是" . $num;
#===========================================
#循环过程中数组的变化如下↓
array(5) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
[4]=>
int(5)
}
array(5) {
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
[4]=>
int(5)
[5]=>
int(1)
}
array(4) {
[2]=>
int(3)
[3]=>
int(4)
[4]=>
int(5)
[5]=>
int(1)
}
array(4) {
[3]=>
int(4)
[4]=>
int(5)
[5]=>
int(1)
[6]=>
int(3)
}
array(3) {
[4]=>
int(5)
[5]=>
int(1)
[6]=>
int(3)
}
array(3) {
[5]=>
int(1)
[6]=>
int(3)
[7]=>
int(5)
}
array(2) {
[6]=>
int(3)
[7]=>
int(5)
}
array(2) {
[7]=>
int(5)
[8]=>
int(3)
}
array(1) {
[8]=>
int(3)
}
大王是3