Помогите пожалуйста с этим заданием !

0 голосов
26 просмотров

Помогите пожалуйста с этим заданием !


image

Информатика (17 баллов) | 26 просмотров
0

На каком языке нужна программа?

0

Паскаль?

0

Добавил вариант с поддержкой отрицательных чисел

Дано ответов: 2
0 голосов
Правильный ответ
// PascalABC.NET 3.2, сборка 1485 от 15.06.2017
// Внимание! Если программа не работает, обновите версию!

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;<br>  (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;<br>      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.

Примеры
Введите числитель и знаменатель дроби: -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
Знаменатель не может быть нулем
(150k баллов)
0 голосов

//Простой вариант
var
  a, b, i, nod, m: integer;

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.

//Вариант с проверкой отрицательных значений

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.

0

Умножив -15 на 8 получите -120, и потом будите умножать на 120?

0

Я использовал для этого переменную типа boolean, что уменьшило потребление памяти приложения

0

По вашему сколько занимает код в скомпилированном состоянии?