Рассмотрим пример решения задачи:
<span>Однажды Винни-Пух захотел полакомиться медом и пошел к пчелам в гости. По дороге нарвал букет цветов, чтобы подарить труженицам пчелкам. Пчелки очень обрадовались, увидев мишку с букетом цветов, и сказали: «У нас есть большая бочка с медом. Мы дадим тебе меда, если ты сможешь с помощью двух сосудов вместимостью 3 л и 5 л налить себе 4 л!» Винни-Пух долго думал, но все-таки смог решить задачку. Как он это сделал?
</span>
<span><span><u>Решение:</u>
<span>Как в результате можно получить 4 л? Нужно из 5-литрового сосуда отлить 1 л. А как это сделать? Нужно в 3-литровом сосуде иметь ровно 2 л. Как их получить? – Из 5-литрового сосуда отлить 3 л.
Решение лучше и удобнее оформить в виде таблицы:</span></span>
<span><span>Ходы123456</span><span>5 л522-54</span><span>3 л-3-223</span></span>
</span>
<span>Наполняем из бочки 5-литровый сосуд медом (1 шаг). Из 5-литрового сосуда отливаем 3 л в 3-литровый сосуд (2 шаг). Теперь в 5-литровом сосуде осталось 2 литра меда. Выливаем из 3-литрового сосуда мед назад в бочку (3 шаг). Теперь из 5-литрового сосуда выливаем те 2 литра меда в 3-литровый сосуд (4 шаг). Наполняем из бочки 5-литровый сосуд медом (5 шаг). И из 5-литрового сосуда дополняем медом 3-литровый сосуд. Получаем 4 литра меда в 5-литровом сосуде (6 шаг). Задача решена.
Поиск решения можно было начать с такого действия: к трем литрам добавить 1 литр.</span> <span>Но тогда решение будет выглядеть следующим образом:
<span><span>Ходы12345678</span><span>5 л-335-114</span><span>3 л3-311-3<span>-( по этому примеру реши)
<span>
</span></span></span></span></span>
<u>PascalABC.NET 3.3.5, сборка 1662 от 29.04.2018</u>
<u>Внимание! Если программа не работает, обновите версию!</u>
function gcd(a,b:integer):integer; // НОД
begin
while b<>0 do begin a:=a mod b; Swap(a,b) end;
Result:=a
end;
procedure RedFrac(var a,b:integer); // сокращение дроби
begin
var (sgna,sgnb):=(Sign(a),Sign(b)); // мы должны учитывать знак!
(a,b):=(Abs(a),Abs(b));
var d:=gcd(a,b);
a:=(a div d)*sgna; b:=(b div d)*sgnb
end;
begin
var (a,b):=ReadInteger2('Введите числитель и знаменатель 1-й дроби:');
var (c,d):=ReadInteger2('Введите числитель и знаменатель 2-й дроби:');
(a,b):=(a*c,b*d);
RedFrac(a,b);
Writeln('Результат умножения: ',a,' / ',b)
end.
<u>Пример</u>
Введите числитель и знаменатель 1-й дроби: 32 1024
Введите числитель и знаменатель 2-й дроби: 60 300
Результат умножения: 1 / 160
<u>В качестве бонуса - решение на базе входящей в состав PascalABC.NET библиотеки численных методов</u>
uses NumLibABC;
begin
var (a,b):=ReadInteger2('Введите числитель и знаменатель 1-й дроби:');
var (c,d):=ReadInteger2('Введите числитель и знаменатель 2-й дроби:');
Writeln('Результат умножения: ',Frc(a,b)*Frc(c,d))
end.
2 Кбайт = 2*1024 байт = 2*1024*8 бит
Память для одного пикселя = 2*1024*8 / (128*128) = 1 бит
Количество цветов = 2^1 = 2
Ответ: 2