Просмотр полной версии : Задача Иосифа Флавия
Сущ-т легенда что Иосиф Флавий выжил и стал известным благодоря математической одаренности. В ходе Иудейской войны он в составе отряда из 41 иудейского воина был загнан римлянами в пещеру. Предпочитая самоубийство в плену, воины решили выстроится в круг и последовательно убивать каждого 3го из живых до тех пор пока е останется ни одного человека. Однако Иосиф на ряду с 1 из единомышленников счел подобный конец бессмысленным - он быстро вычеслил места в круге на которые себя и товарища. И лишь поэтому остался жив.
Исключать k-го, пока не останется 1 человек. Определить номер уцелевшего.
как на пхп реализовать а то я уже вешаюсь
А правильный ответ какой?
Если исключать каждого k-го человека, то в конце останутся k первых человек. Так?
Если да, то могу привести код, который привел меня к такому выводу.
Неправильно.
P.S. Уже почти дописал правильный код.
$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) перевести получившееся число в десятичную систему счисления.
<?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
ну да.. у мя непрально так как k = 2.. лоханулся я =)
мда мозги у меня не варят 5 часов убил блин
неа не правильно кстати :-)
если ввести что убивать каждого 7 и войнов будет 8 то (!)7 останиться живым
кто поможет с меня + а то мозги опять не варят сессия её мать
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot