<em>// PascalABC.NET 3.2, сборка 1485 от 15.06.2017</em> <em>// Внимание! Если программа не работает, обновите версию!</em>
function GCD(a,b:integer):integer; begin while b<>0 do begin a:=a mod b; Swap(a,b) end; Result:=a end;
procedure TruncFrac(var a,b:integer); begin var z:=a*b<0?-1:1; (a,b):=(Abs(a),Abs(b)); var k:=GCD(a,b); (a,b):=((a div k)*z,b div k) end;
procedure Print(a,b:integer); begin if b=1 then Write(a) else begin if Abs(a)>b then begin Writeln(a div b,' ',Abs(a) mod b,'/',b) end else begin if a<0 then begin Write('-'); a:=-a end; Writeln(a,'/',b) end end end;
begin Write('Введите числитель и знаменатель дроби: '); var (p,q):=ReadInteger2; if p=0 then Writeln(0) else if q=0 then Writeln('Знаменатель не может быть нулем') else begin TruncFrac(p,q); Print(p,q) end end.
<u>Примеры</u> Введите числитель и знаменатель дроби: -156 70 -2 8/35 Введите числитель и знаменатель дроби: 1024 64 16 Введите числитель и знаменатель дроби: -158 42 -3 16/21 Введите числитель и знаменатель дроби: 356238 -3652 -97 997/1826 Введите числитель и знаменатель дроби: -150 -70 2 1/7 Введите числитель и знаменатель дроби: 12 0 Знаменатель не может быть нулем
begin writeln('Введите a,b'); readln(a, b); if a > b then m := b else m := a; for i := 1 to m do begin if (b mod i = 0) and (a mod i = 0) then nod := i; end;
if (a < b) then writeln('Ответ ', a / nod, '/', b / nod) else writeln('Ответ ', a div b, ' ', (a mod b) / nod, '/', b / nod); end.
<span>//Вариант с проверкой отрицательных значений
var m, i, a, b, n: integer; flag: boolean;
begin flag := false; writeln('Введите a,b'); readln(a, b); if a < 0 then a := -a else flag := not (flag); if b < 0 then b := -b else flag := not (flag); if a > b then m := b else m := a; for i := 1 to m do begin if (b mod i = 0) and (a mod i = 0) then n := i; end; a := a div n; b := b div n; if flag then begin if (a < b) then writeln('Ответ -', a / n, '/', b / n) else if (a mod b = 0) then writeln('Ответ -', a div b) else writeln('Ответ -', a div b, ' ', a mod b, '/', b); end else if (a < b) then writeln('Ответ ', a / n, '/', b / n) else if (a mod b = 0) then writeln('Ответ ', a div b) else writeln('Ответ ', a div b, ' ', a mod b, '/', b); end. </span>
Обозначим неизвестное нам основание как x. По общей формуле представления чисел в позиционной системе счисления (поищите в сети саму формулу, на этом ресурсе ссылки, к сожалению, запрещены:) ) 30 можно представить как 3*x^1 + 0*x^0 т.е. 3x и приравнять к 24. Выходит: 3x = 24 x = 8 Основание неизвестной системы счисления: 8. Если есть вопросы по поводу решения - оставляйте в комментариях:)