Вариант 22. Два сплава
Имеется два сплава из двух металлов, соотношение этих металлов
в каждом из сплавов известно. Программа должна определять, какое
количество объёмных единиц первого и второго сплава нужно взять,
чтобы получить третий сплав с заданным соотношением этих
металлов.
Входные данные. Соотношение двух металлов в первом сплаве,
во втором сплаве и в требуемом сплаве, а также количество объёмных
единиц третьего сплава, которое требуется получить.
Выходные данные. Количество объёмных единиц первого и
второго сплава, которые следует соединить, для получения заданного
количества третьего сплава, либо сообщение о том, что получить
третий сплав из имеющихся двух невозможно.
Напишите пожалуйста код решения отдельных моментов: оба соотношения в сплаве больше 1 и оба соотношения в сплаве меньше 1.Или объясните,почему тогда нет решения в положительных числах.
Answers & Comments
===== 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.