Показать сообщение отдельно
  #2  
Старый 04.12.2007, 04:00
Rosenkrantz Rosenkrantz вне форума
Активный
 
Регистрация: 04.12.2007
Адрес: Москва
Сообщения: 234
Версия Delphi: Delphi 7
Репутация: 40
По умолчанию

Сегодня у меня утро добрых дел.

Код:
{$APPTYPE CONSOLE}
//------------------------------------------------------------------------------
// Нахождение наибольшего общего делителя
//------------------------------------------------------------------------------
function NOD_Euclid(A, B: LongInt): LongInt;
begin
  A := Abs(A);
  B := Abs(B);

  if (A = 0) or (B = 0) then begin
    Result := A + B;
    Exit;
  end;

  while A <> B do
    if A > B then A := A - B
             else B := B - A;

  Result := B;
end;

//------------------------------------------------------------------------------
// Функция складывает и сокращает дроби A/B и C/D
// Результат возвращает в виде строки 'X/Y'
//------------------------------------------------------------------------------
function  FractionSum(A, B, C, D: Integer): String;
var
  X, Y, N: Cardinal;
begin
  // Сумма дробей = (A*B + C*D) / (B * D)
  X := A * D + C * B; // Числитель дроби результата
  Y := B * D;         // Знаменатель дроби результата

  // Находим наибольший общий делитель для числителя и знаменателя результата
  N := NOD_Euclid(X, Y);
  // Сокращаем результат
  X := Trunc(X / N);
  Y := Trunc(Y / N);

  // Преобразуем в строку и возвращаем
  Result := IntToStr(X) + '/' + IntToStr(Y);
end;

begin
  // Складываем дроби 1/5 и 3/10
  Writeln(FractionSum(1, 5, 3, 10));
end.
Ответить с цитированием