PHP實現 約瑟夫報數問題

有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開始報。

發佈了41 篇原創文章 · 獲贊 14 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章