Другие языки программирования и технологии

Как ответ на эту задачу записать в паскале, либо просто в алгоритм?

Как ответ на эту задачу записать в паскале, либо просто в алгоритм? Известно, что среди 80 монет имеется одна фальшивая, более легкая , чем остальные, имеющие все одинаковый вес. При помощи четырех взвешиваний на чашечных весах без гирь найти фальшивую монету. Ответ: Разделим наши монеты на группы: две группы по 27 монет и одну в 26 монет. При первом взвешивании поместим на чашки весов группы по 27 монет. Если весы не уравновесятся, то фальшивая монета находится на более “легкой” чашке. Если же весы окажутся в равновесии, то фальшивая монета содержится в группе из 26 монет. Таким образом, нам достаточно научиться решать задачу: тремя взвешиваниями выделить фальшивую монету из группы в 27 монет ( задача выделить фальшивую монету из группы в 26 монет может быть сведена к этой задаче, например, добавлением к группе из 26 монет еще одной произвольной монеты из числа остальных 54). При втором взвешивании разделим группу в 27 монет на три группы по 9 монет в каждой. Поместив на обе чашки весов по группе из 9 монет, найдем группу из 9 монет, в которой содержится фальшивая монета. Разделив группу из 9 монет, одна из которых фальшивая, на три группы по 3 монеты, мы третьим взвешиванием выделим тройку монет, в которой содержится фальшивая. Наконец, тем же путем при четвертом взвешивании найдем фальшивую монету.
Tigran Hovhannisian
Tigran Hovhannisian
108
Function Monets(N : Word) : String;
var
M : String;
begin
Str(N, M);
if N mod 100 in [10..20] then M := M + ' монет'
else if N mod 10 = 1 then M := M + ' монета'
else if N mod 10 in [2, 3, 4] then M := M + ' монеты'
else M := M + ' монет';
Monets := M;
end;

Procedure FindLight(Tab : String; All : Word);
var
A, B, C : Word;
begin
A := Trunc(All / 3);
if A < All / 3 then Inc(A);
B := A;
C := All - A - B;
//WriteLn(A, ' ', B, ' ', C);
if A = C then
if A > 1 then
begin
WriteLn( Tab, '- Разделим на 3 кучки по ', Monets(A), ' и взвесим 2 из них: ');
WriteLn( Tab, ' - если одна из кучек легче, в ней фальшивая монета');
FindLight(Tab + ' | ', A);
WriteLn( Tab, ' - если кучки одинаковые, фальшивая монета в кучке, которую не взвешивали. ');
FindLight(Tab + ' ', A);
WriteLn( Tab);
end
else
begin
WriteLn(Tab, '- Разделим монеты по одной и взвесим 2 из них: ');
WriteLn(Tab, ' - если одна из монет легче, значит она фальшивая! ');
WriteLn(Tab, ' - если монеты одинаковые, фальшивая монета та, которую не взвешивали! ');
end
else
if A > 1 then
if C > 0 then
begin
WriteLn( Tab, '- Разделим на 2 кучки по ', Monets(A), ' и ', Monets(C), ':');
WriteLn( Tab, ' - если одна из кучек легче, значит фальшивая в ней');
FindLight( Tab + ' | ', A);
if C > 1 then
begin
WriteLn( Tab, ' - если кучки одинаковые, то фальшивая в той, которую не взвешивали');
FindLight(Tab + ' ', C);
WriteLn( Tab);
end
else
WriteLn( Tab, ' - если кучки одинаковые, то фальшивая та, которую не взвешивали! ');
end
else
begin
WriteLn( Tab, '- Разделим по ', Monets(A), ' и взвесим их: ');
WriteLn( Tab, ' - фальшивая монета среди тех, что оказались легче. ');
FindLight(Tab + ' ', A);
WriteLn( Tab);
end
else
begin
WriteLn(Tab, '- Взвесим 2 монеты: ');
WriteLn(Tab, ' - та монета, которая оказалась легче - фальшивая. ');
end;
end;

var
N : Word;
begin
Write('Введите число монет: '); ReadLn(N);
WriteLn('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
if N = 1 then Write('Нет возможности найти фальшивую! Не с чем сравнивать... ')
else
begin
WriteLn('Как найти фальшивую: ');
FindLight('', N);
WriteLn('Фальшивая монета найдена! ');
end;
end.
Алексей Голубев
Алексей Голубев
73 323
Лучший ответ
вес монет записываем в массив и проверяем условия, как описано в решение.
Barber Nv
Barber Nv
604