===== PascalABC.NET =====
function НОД(a, b: integer): integer;
begin
(a, b) := (Abs(a), Abs(b));
while b <> 0 do
(a, b) := (b, a mod b);
Result := a
end;
function Подходит(a, b: integer) :=
(Sign(a) = Sign(b)) and (b <> 0);
procedure СократитьДробь(var a, b: integer);
begin
var d := НОД(a, b);
if d > 1 then
(a, b) := (a div d, b div d)
end;
begin
Println('Введите соотношения металлов в сплаве.');
Println('Числа частей целые и вводятся через пробел.');
var (a1, b1) := ReadInteger2('Первый сплав:');
var (a2, b2) := ReadInteger2('Второй сплав:');;
var (a3, b3) := ReadInteger2('Нужный сплав:');;
var y1 := (a2 + b2) * (a1 * b3 - b1 * a3);
var y2 := a1 * b2 - a2 * b1;
if not Подходит(y1, y2) then
begin
Println('Решения нет');
exit
end;
var x1 := (a3 + b3) * y2 - y1;
var x2 := y2;
if not Подходит(x1, x2) then
begin
Println('Решения нет');
exit
end;
СократитьДробь(y1, y2);
СократитьДробь(x1, x2);
var (r1, r2) := (x1 * y2, x2 * y1);
СократитьДробь(r1, r2);
var v := ReadReal('Требуемый объем сплава:');
Writeln('Соотношение частей металла ', r1, ' : ', r2);
Writeln('Соотношение объемов: ', v * r1 / (r1 + r2),
' : ', v * r2 / (r1 + r2))
end.