Proc47. Используя функцию NOD2 из задания Proc46, описать процедуру Frac1(a, b, p, q), преобразующую дробь a/b к несократимому виду p/q (все параметры процедуры — целого типа, a и b — входные, p и q — выходные). Знак результирующей дроби p/q приписывается числителю (то есть q>0). С помощью Frac1 найти несократимые дроби, равные a/b+c/d,a/b+e/f,a/b+g/h (числа a,b,c,d,e,f,g,h даны).
Формулы:
ab+cd=a∗db∗d+c∗bd∗b=a∗d+c∗bb∗d
ab+ef=a∗fb∗f+e∗bf∗b=a∗f+e∗bb∗f
ab+gh=a∗hb∗h+g∗bh∗b=a∗h+g∗bb∗h
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
program Proc47; Function NOD2(A,B:Integer):Integer; begin while (A<>0) and (B<>0) do begin if a>b then A:=(a mod b) else B:=(B mod A); end; NOD2:=A+B; end; Procedure Frac1(a,b:integer;var p,q:integer); begin p:=a div NOD2(a,b); q:=b div NOD2(a,b); end; var A, B, C, D, E, F, G, H, rez1,rez2: integer; begin Write('A :'); Readln(A); Write('B :'); Readln(B); Frac1(a,b,rez1,rez2); Writeln(Rez1,'/',Rez2); Write('C :'); Readln(C); Write('D :'); Readln(D); Write('E :'); Readln(E); Write('F :'); Readln(F); Write('G :'); Readln(G); Write('H :'); Readln(H); Frac1(a*d+c*b,b*d,rez1,rez2); Writeln(Rez1,'/',Rez2); Frac1(a*f+e*b,b*f,rez1,rez2); Writeln(Rez1,'/',Rez2); Frac1(a*h+g*b,b*h,rez1,rez2); Writeln(Rez1,'/',Rez2); Readln; end. |
Другие задачи из раздела Proc можно посмотреть здесь.
Для учета знака результата (см. условие) необходимо брать абсолютные значения