program schitalochka;
uses crt;
type point=^list;
list = record
data:integer;
next:point;
end;
var a,head:point;
t,n,k:integer;
procedure createlist(n:integer);
var i:integer;
begin
for i:=n downto 1 do
begin
new(a);
a^.data:=i;
a^.next:=head;
head:=a;
end;
while a^.next<>nil do a:=a^.next;
a^.next:=head;
head:=a^.next;
end;
procedure delete_el(k:integer);
var buf:point;
i:integer;
begin
while a^.data<>a^.next^.data do
begin
for i:=1 to k-2 do a:=a^.next;
buf:=a^.next;
{write(buf^.data:3);}
a^.next:=buf^.next;
dispose(buf);
a:=a^.next;
end;
end;
begin
clrscr;
createlist(5);
a:=head;
{while a<>nil do
begin
write(a^.data:3);
a:=a^.next;
inc(t);
if t=1000 then break;
end;
a:=head;}
writeln;
delete_el(2);
writeln;
writeln(a^.data);
readln;
end.
Задача про математика Иосифа Флавия.
Сущ-т легенда что Иосиф Флавий выжил и стал известным благодоря математической одаренности. В ходе Иудейской войны он в составе отряда из 41 иудейского воина был загнан римлянами в пещеру. Предпочитая самоубийство в плену, воины решили выстроится в круг и последовательно убивать каждого 3го из живых до тех пор пока е останется ни одного человека. Однако Иосиф на ряду с 1 из единомышленников счел подобный конец бессмысленным - он быстро вычеслил места в круге на которые себя и товарища. И лишь поэтому остался жив.
Исключать k-го, пока не останется 1 человек. Определить номер уцелевшего.
Огромное спасибо!!!
Извините что не в тот раздел влез, понял когда написал.
1. Создаем массив из N чисел.
2. Заполняем a=1
3. Пока в массиве больше 2х единиц
4. Ищем единицу - пропускаем (2 раза)
5. Ищем единицу - заменяем на 0
Это на самом деле так называемая "считалка Джозефуса". Можешь поискать в Интернете, насколько я помню там даже выводяться какие то формулы, позволяюцие посчитать этого человека, но не уверен. А вобще самое простое решение - замкнутый(кольцевой) список, то есть фактически то что предложил Hydra.
Большое спасибо!!!