PHP算法题02-猴子当大王
题目
一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。用程序模拟该过程。
解析
1、首先将猴子从1到n编号存放到数组中
2、对猴子的总个数进行循环
3、循环时将数到编号的猴子从数组中删除
4、将被被踢的猴子从原来位置移动到数组尾部,移动后删除原猴子的位置编号
5、循环时,判断猴子数组个数大于1则继续循环
6、剩下最后一个编号的猴子则是大王
实现
方式一
<?php
/**
* 猴子当大王
*
* @param int $n 猴子总数
* @param int $m 数到第几只的那只猴子被踢出去
* @return int
*/
function monkey_king(int $n , int $m):int {
// 构造猴子总数的数组
$monkeys = range(1 , $n);
$i = 0;
// 循环判断猴子大王是否计算出来
while (count($monkeys) > 1) {
// 判断是否为要踢出去的猴子
if (($i + 1) % $m == 0) {
// 删除被踢出去的猴子
unset($monkeys[$i]);
} else {
// 将没有被踢出的猴子压入猴子数组尾部
array_push($monkeys, $monkeys[$i]);
unset($monkeys[$i]);
}
$i++;
}
return current($monkeys);
}
$monkey = monkey_king(5 , 3);
echo '猴王是:' . $monkey . '<br>';
请登录后再评论