题目:有17个人围成一圈(编号0~16),从第0号的人开始从1报数,凡报到3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止,问此人原来的位置是多少号?
思想:1.设定数组,把这些人按照编号存入数组,且加一个标记位,0代表没有被移出,1代表移出。
2.执行无限循环,在每一次循环中,对整个数组进行遍历,判断每个数组元素的标记为是否为0,如果为0则继续报数,如果此数能被3整除,该数组元素标记位设为1,并且移出的总人数+1。当移出总人数达到16人,则break退出无限循环,剩下的为胜者。
代码:
<?php
$person = array
(
array("0",0),
array("1",0),
array("2",0),
array("3",0),
array("4",0),
array("5",0),
array("6",0),
array("7",0),
array("8",0),
array("9",0),
array("10",0),
array("11",0),
array("12",0),
array("13",0),
array("14",0),
array("15",0),
array("16",0),
);
//报数
$j = 0;
//移出位人数
$num = 0;
//执行循环
while(1)
{
//遍历整个数组
for($k=0;$k<17;$k++)
{
//如果此数组元素没有移出位
if($person[$k][1]==0)
{
//此数组元素继续报数
$j=$j+1;
//如果报的数能被3整除
if($j%3==0)
{
//此数组元素标记移出位
$person[$k][1]=1;
//出位人数+1
$num=$num+1;
}
}
}
//如果出位人数达到16人,则最后一人获胜,退出循环
if($num==16)
{
break;
}
}
var_dump($person) ;
?>
结果:
array (size=17)
0 =>
array (size=2)
0 => string '0' (length=1)
1 => int 1
1 =>
array (size=2)
0 => string '1' (length=1)
1 => int 1
2 =>
array (size=2)
0 => string '2' (length=1)
1 => int 1
3 =>
array (size=2)
0 => string '3' (length=1)
1 => int 1
4 =>
array (size=2)
0 => string '4' (length=1)
1 => int 1
5 =>
array (size=2)
0 => string '5' (length=1)
1 => int 1
6 =>
array (size=2)
0 => string '6' (length=1)
1 => int 1
7 =>
array (size=2)
0 => string '7' (length=1)
1 => int 1
8 =>
array (size=2)
0 => string '8' (length=1)
1 => int 1
9 =>
array (size=2)
0 => string '9' (length=1)
1 => int 1
10 =>
array (size=2)
0 => string '10' (length=2)
1 => int 0
11 =>
array (size=2)
0 => string '11' (length=2)
1 => int 1
12 =>
array (size=2)
0 => string '12' (length=2)
1 => int 1
13 =>
array (size=2)
0 => string '13' (length=2)
1 => int 1
14 =>
array (size=2)
0 => string '14' (length=2)
1 => int 1
15 =>
array (size=2)
0 => string '15' (length=2)
1 => int 1
16 =>
array (size=2)
0 => string '16' (length=2)
1 => int 1
10号位的人为所求解