有10個人報數,從1,2,3開始報,但有人喊道3時,退出。然後從退出的後面一個人開始重新報數,數到3的人又退出,直到剩下最後一個人。
$inCir = array();
// 如果有10個人, 每個人都在圓圈內
for ($i=1; $i<=10; $i++) {
$inCir[$i] = 1;
}
$countPeople = count($inCir);
// 開始報數
$callNo = 0;
// 從第一個人開始報數
$peopleNo = 1;
// 出去的人人數
$outCir = 0;
// 當只有一個人的時候,停止循環
while($outCir !== $countPeople - 1) {
// 如果此人麼有出去,則繼續報號
if ($inCir[$peopleNo] == 1) {
$callNo++ ;
}
//如果此人報數爲3 則設置爲已經出去
if ($callNo === 3) {
$inCir[$peopleNo] = 0;
$outCir++;
// 重新開始報號
$callNo = 0;
}
// 該下一個人報號
$peopleNo = $peopleNo + 1;
// 如果到第10個人,則有重新回到第一個人
if ($peopleNo > $countPeople) {
$peopleNo = 1;
}
}
for ($i=1; $i<=$countPeople; $i++) {
if ($inCir[$i] == 1) {
echo $inCir[$i];
}
}
在做這個題目遇到的問題:
初始化報數從1開始,$callNo=1 因爲我想到的是從1開始報數。 這樣做有一個問題是,第二個人就報3了,事實上應該是第三個人報3,這是爲什麼呢?
因爲,如果報數從1開始,檢測第一個人是否被踢出去,自然沒有被踢出去出去,報數變成2。 接下來,就是輪到第二個人,檢測第二個人也沒有出去,然後 注意,這個時候,報數變成3了,最終判定這個人要被踢出去,但此時這個人還是第二個人,報數增加1之後,才輪到下一人!!
這個問題,就是報數報早了,所以 必須從0開始報。