Даны две дроби a/b и c/d (a,b,c,d - натуральные числа). составить программу умножения дроби на дробь. ответ должен быть несократимой дробью. использовать подпрограмму алгоритма евклида для определения нод
PascalABC.NET 3.3.5, сборка 1662 от 29.04.2018 Внимание! Если программа не работает, обновите версию!
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.
Пример Введите числитель и знаменатель 1-й дроби: 32 1024 Введите числитель и знаменатель 2-й дроби: 60 300 Результат умножения: 1 / 160
В качестве бонуса - решение на базе входящей в состав PascalABC.NET библиотеки численных методов
uses NumLibABC;
begin var (a,b):=ReadInteger2('Введите числитель и знаменатель 1-й дроби:'); var (c,d):=ReadInteger2('Введите числитель и знаменатель 2-й дроби:'); Writeln('Результат умножения: ',Frc(a,b)*Frc(c,d)) end.
Внимание! Если программа не работает, обновите версию!
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.
Пример
Введите числитель и знаменатель 1-й дроби: 32 1024
Введите числитель и знаменатель 2-й дроби: 60 300
Результат умножения: 1 / 160
В качестве бонуса - решение на базе входящей в состав PascalABC.NET библиотеки численных методов
uses NumLibABC;
begin
var (a,b):=ReadInteger2('Введите числитель и знаменатель 1-й дроби:');
var (c,d):=ReadInteger2('Введите числитель и знаменатель 2-й дроби:');
Writeln('Результат умножения: ',Frc(a,b)*Frc(c,d))
end.