Другие языки программирования и технологии
Помогите решить задачу решение на Паскале
В нашем варианте мы начнем с того, что выстроим в круг N человек, пронумерованных числами от 1 до N, и будем исключать каждого k-ого до тех пор, пока не уцелеет только один человек. (Например, если N=10, k=3, то сначала умрет 3-й, потом 6-й, затем 9-й, затем 2-й, затем 7-й, потом 1-й, потом 8-й, за ним – 5-й, и потом 10-й. Таким образом, уцелеет 4-й.) Задача: определить номер уцелевшего. Формат входных данных Во входном файле даны натуральные числа N и k. 1 ≤ N ≤ 100000, 1 ≤ k ≤ 100. Формат выходных данных Выходной файл должен содержать единственное число – номер уцелевшего человека. Пример input.txt output.txt 10 3 4
Как-то так
program pr_ring;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
pRing = ^TRing;
TRing = record
Value: integer;
Prev, Next: pRing;
end;
procedure Insert(var ring: pRing);
var
p, n: pRing;
begin
p := ring;
if (p = nil) then
begin
New(p);
p^.Value := 1;
p.Next := p;
p.Prev := p;
ring := p;
end
else begin
while (p^.Next <> ring) do
p := p^.Next;
New(n);
n^.Value := p^.Value + 1;
n.Next := ring;
n.Prev := p;
p^.Next := n;
ring^.Prev := n;
end;
end;
function Length(ring: pRing): integer; forward;
procedure Delete(var ring, last: pRing; Pos: integer);
var
p, pr, nx: pRing;
i: integer;
begin
p := last;
if (p <> nil) then
begin
for i := 1 to Pos - 1 do
p := p^.Next;
pr := p^.Prev;
nx := p^.Next;
pr^.Next := nx;
nx^.Prev := pr;
last := nx;
if (ring = p) then
ring := last;
Dispose(p);
end;
end;
function Length(ring: pRing): integer;
var
p: pRing;
c: integer;
begin
if (ring = nil) then
Length := 0
else begin
c := 1;
p := ring;
while (p^.Next <> ring) do
begin
p := p^.Next;
Inc(c);
end;
Length := c;
end;
end;
var
n, k, i: integer;
ring, last: pRing;
f1, f2: Text;
begin
Assign(f1, 'input.txt');
Reset(f1);
Assign(f2, 'output.txt');
Rewrite(f2);
ring := nil;
read(f1, n);
read(f1, k);
for i := 1 to n do
Insert(ring);
last := ring;
while (Length(ring) <> 1) do
Delete(ring, last, k);
writeln(f2, ring^.Value);
Dispose(ring);
Close(f1);
Close(f2);
end.
program pr_ring;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
pRing = ^TRing;
TRing = record
Value: integer;
Prev, Next: pRing;
end;
procedure Insert(var ring: pRing);
var
p, n: pRing;
begin
p := ring;
if (p = nil) then
begin
New(p);
p^.Value := 1;
p.Next := p;
p.Prev := p;
ring := p;
end
else begin
while (p^.Next <> ring) do
p := p^.Next;
New(n);
n^.Value := p^.Value + 1;
n.Next := ring;
n.Prev := p;
p^.Next := n;
ring^.Prev := n;
end;
end;
function Length(ring: pRing): integer; forward;
procedure Delete(var ring, last: pRing; Pos: integer);
var
p, pr, nx: pRing;
i: integer;
begin
p := last;
if (p <> nil) then
begin
for i := 1 to Pos - 1 do
p := p^.Next;
pr := p^.Prev;
nx := p^.Next;
pr^.Next := nx;
nx^.Prev := pr;
last := nx;
if (ring = p) then
ring := last;
Dispose(p);
end;
end;
function Length(ring: pRing): integer;
var
p: pRing;
c: integer;
begin
if (ring = nil) then
Length := 0
else begin
c := 1;
p := ring;
while (p^.Next <> ring) do
begin
p := p^.Next;
Inc(c);
end;
Length := c;
end;
end;
var
n, k, i: integer;
ring, last: pRing;
f1, f2: Text;
begin
Assign(f1, 'input.txt');
Reset(f1);
Assign(f2, 'output.txt');
Rewrite(f2);
ring := nil;
read(f1, n);
read(f1, k);
for i := 1 to n do
Insert(ring);
last := ring;
while (Length(ring) <> 1) do
Delete(ring, last, k);
writeln(f2, ring^.Value);
Dispose(ring);
Close(f1);
Close(f2);
end.
ты правда думаешь что тебе кто то будет это все решать? лучше учи pascal, сейчас созданы для этого все условия! Хочешь книжку купи, хочешь видео курс закажи (pascalvideo. ru) возможностей куча!! ! а не сиди здесь и не клянчи решение!!!
ай яй яй как не стыдно это ж Всеросийская олимпиада по информатике должно быть стыдно
сам решай свою олимпиаду нечево у гениев решение просить
Да, вопрос ты так и не задал. Сделать это за тебя?!
ты где учишься????
Похожие вопросы
- Помогите решить задачу на Турбо паскале
- Народ! Помогите решить задачи на языке паскаль. Очень срочно надо! Буду рада решению хотя бы одной из списка=)
- Помогите решить задачу на языке Паскаль. Найти сумму всех чётных чисел от 1 до 1000 (задачу решить 2 способами)
- Помогите решить задачу в турбо паскаль
- помогите решить задачу на турбо паскале
- Помогите решить задачу по информатике ...паскаль
- Помогите решить задачи по Паскалю
- помогите решить задачу на паскале: напечатать "столбиком" значения sin2, sin3, ..sin 20.
- помогите решить задачу на паскале. +10 за решение)
- Помогите решить задачу в паскале