Задача Иосифа Флавия

Discussion in 'PHP' started by Vallez, 20 Jan 2009.

  1. Vallez

    Vallez Elder - Старейшина

    Joined:
    25 Dec 2005
    Messages:
    88
    Likes Received:
    19
    Reputations:
    -8
    Сущ-т легенда что Иосиф Флавий выжил и стал известным благодоря математической одаренности. В ходе Иудейской войны он в составе отряда из 41 иудейского воина был загнан римлянами в пещеру. Предпочитая самоубийство в плену, воины решили выстроится в круг и последовательно убивать каждого 3го из живых до тех пор пока е останется ни одного человека. Однако Иосиф на ряду с 1 из единомышленников счел подобный конец бессмысленным - он быстро вычеслил места в круге на которые себя и товарища. И лишь поэтому остался жив.
    Исключать k-го, пока не останется 1 человек. Определить номер уцелевшего.

    как на пхп реализовать а то я уже вешаюсь
     
  2. kolpeex

    kolpeex Member

    Joined:
    17 Feb 2008
    Messages:
    21
    Likes Received:
    8
    Reputations:
    0
    А правильный ответ какой?
    Если исключать каждого k-го человека, то в конце останутся k первых человек. Так?
    Если да, то могу привести код, который привел меня к такому выводу.

    Неправильно.

    P.S. Уже почти дописал правильный код.
     
    #2 kolpeex, 20 Jan 2009
    Last edited: 20 Jan 2009
  3. Trieg

    Trieg Elder - Старейшина

    Joined:
    26 Oct 2007
    Messages:
    82
    Likes Received:
    9
    Reputations:
    0
    PHP:

    $n 
    271;
    $tempN decbin($n);
    //Ищем первую 1 и оставляем в строке усе что после первой единицы
    $tempN substr($tempNstrpos($tempN'1') + 1);
    //Чистим строку от нулей которые идут до первой единицы (их может и не быть..)
    $tempN substr($tempNstrpos($tempN'1'));
    $res bindec($tempN.'1'); // Вот что искали..
    echo 'Номер уцелевшего:'.$res;

    Сам я в подобном не шарю.. в общем залез в гугл нашел алгоритм решения и реализовал его на пыхе (может и корявенько.. но на более у меня нет времени)

    1) число n перевести в двоичную систему;

    2) в полученном двоичном числе первую слева единицу приписать в конце

    3) перевести получившееся число в десятичную систему счисления.
     
    1 person likes this.
  4. kolpeex

    kolpeex Member

    Joined:
    17 Feb 2008
    Messages:
    21
    Likes Received:
    8
    Reputations:
    0
    Code:
    <?php
        //исключаем каждого $k-го
        $k = 3;
        //создаем 41 иудейского война
        $warriors = range(1,41);
        
        echo '<pre>';
        $i=0;
        $offset=0;
        while(count($warriors)>=$k) {
            $i++;
            if($i%$k==0) { //убиваем этого
                $offset = ($offset+2) % count($warriors);
                //echo $i.', ['.$offset.']='.$warriors[$offset]."\n";
                array_splice($warriors, $offset, 1);
            }
        }
        print_r($warriors);
    $k и кол-во иудейских войнов можно изменить - все работает.
     
    #4 kolpeex, 20 Jan 2009
    Last edited: 20 Jan 2009
    1 person likes this.
  5. Vallez

    Vallez Elder - Старейшина

    Joined:
    25 Dec 2005
    Messages:
    88
    Likes Received:
    19
    Reputations:
    -8
    я сам не могу понять ) какой правельный
     
  6. kolpeex

    kolpeex Member

    Joined:
    17 Feb 2008
    Messages:
    21
    Likes Received:
    8
    Reputations:
    0
    Для простоты берем 8 войнов и вычеркиваем каждого третьего по кругу:
    12345678
    12_45678
    12_45_78 (*)
    _2_45_78
    _2_4__78
    ___4__78
    ___4__7_

    (*)Вычеркивание по кргу значит:
    Берем 12_45_78. Следующий для удал. эелемент как бы 9. Ставим рядом.
    12_45_7812_45_78
    Вычеркиваем "9" эелемент.
    12_45_78_2_45_78. Убираем первую часть.
    _2_45_78
     
    #6 kolpeex, 20 Jan 2009
    Last edited: 20 Jan 2009
  7. Trieg

    Trieg Elder - Старейшина

    Joined:
    26 Oct 2007
    Messages:
    82
    Likes Received:
    9
    Reputations:
    0
    ну да.. у мя непрально так как k = 2.. лоханулся я =)
     
  8. Vallez

    Vallez Elder - Старейшина

    Joined:
    25 Dec 2005
    Messages:
    88
    Likes Received:
    19
    Reputations:
    -8
    мда мозги у меня не варят 5 часов убил блин
     
  9. Vallez

    Vallez Elder - Старейшина

    Joined:
    25 Dec 2005
    Messages:
    88
    Likes Received:
    19
    Reputations:
    -8
    неа не правильно кстати :)
     
  10. Vallez

    Vallez Elder - Старейшина

    Joined:
    25 Dec 2005
    Messages:
    88
    Likes Received:
    19
    Reputations:
    -8
    если ввести что убивать каждого 7 и войнов будет 8 то (!)7 останиться живым
     
  11. Vallez

    Vallez Elder - Старейшина

    Joined:
    25 Dec 2005
    Messages:
    88
    Likes Received:
    19
    Reputations:
    -8
    кто поможет с меня + а то мозги опять не варят сессия её мать