1

100人が輪になって並んでいるとします。1 人から 14 人まで数えて、その人をサークルから外します。カウント順に従って、再度カウントし、14 人目を削除します。繰り返す。最後に立っている人は誰ですか?

これを解決するためにあらゆることを試しましたが、デッド ループでは機能していないようです。

<?php
//init array
$array = array();
for ($i = 0; $i < 100; $i++) { $array[] = $i; }

//start from 0
$pos = 0;
while (count_not_null($array) > 1) {
    //reset count
    $count = 0;
    while (true) {
        //ignore NULL for count, that position is already removed
        if ($array[$pos] !== NULL) {
            $count++;
            if($count == 14) { break; }
        }
        $pos++;
        //go back to beginning, we cant go over 0-99, for 100 elements
        if ($pos > 99) { $pos = 0; }
    }
    echo "set index {$pos} to NULL!" ."<br>";
    $array[$pos] = NULL;
    if (count_not_null($array) === 1) { break; }
}

echo "<pre>";
print_r($array);
echo "</pre>";


//counting not null elements
function count_not_null($array) {
    $count = 0;
    for ($i = 0; $i < count($array); $i++) {
        if ($array[$i] !== NULL) { $count++; }
    }
    return $count;
}
?>
4

3 に答える 3

2

問題はこのwhileループです

    while ($count < 14) {
        if ($array[$pos] != NULL) {
            $count++;
        }
        $pos++;
        if ($pos > 99) { $pos = 0; }
    }

count が 14 であっても $pos をインクリメントするため、不正な値で終了し、永久にループします。これを次のように置き換えます。

    while (true) {
        if ($array[$pos] != NULL) {
            $count++;
            if($count == 14) {break;}
        }
        $pos++;
        if ($pos > 99) { $pos = 0; }
    }

また、0 と NULL を比較しても、@Barmar で言及されているように期待される結果が得られないため、NULL 比較を変更するか、1 から数え始めることができます。

注:毎回配列をループしないと、これははるかに高速になります:D変数を使用して残りのアイテムをカウントすることを検討してください

于 2015-12-08T22:10:57.713 に答える