Сущ-т легенда что Иосиф Флавий выжил и стал известным благодоря математической одаренности. В ходе Иудейской войны он в составе отряда из 41 иудейского воина был загнан римлянами в пещеру. Предпочитая самоубийство в плену, воины решили выстроится в круг и последовательно убивать каждого 3го из живых до тех пор пока е останется ни одного человека. Однако Иосиф на ряду с 1 из единомышленников счел подобный конец бессмысленным - он быстро вычеслил места в круге на которые себя и товарища. И лишь поэтому остался жив. Исключать k-го, пока не останется 1 человек. Определить номер уцелевшего. как на пхп реализовать а то я уже вешаюсь
А правильный ответ какой? Если исключать каждого k-го человека, то в конце останутся k первых человек. Так? Если да, то могу привести код, который привел меня к такому выводу. Неправильно. P.S. Уже почти дописал правильный код.
PHP: $n = 271; $tempN = decbin($n); //Ищем первую 1 и оставляем в строке усе что после первой единицы $tempN = substr($tempN, strpos($tempN, '1') + 1); //Чистим строку от нулей которые идут до первой единицы (их может и не быть..) $tempN = substr($tempN, strpos($tempN, '1')); $res = bindec($tempN.'1'); // Вот что искали.. echo 'Номер уцелевшего:'.$res; Сам я в подобном не шарю.. в общем залез в гугл нашел алгоритм решения и реализовал его на пыхе (может и корявенько.. но на более у меня нет времени) 1) число n перевести в двоичную систему; 2) в полученном двоичном числе первую слева единицу приписать в конце 3) перевести получившееся число в десятичную систему счисления.
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 и кол-во иудейских войнов можно изменить - все работает.
Для простоты берем 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