9425. Дроби: сложение и вычитание

 

Даны две дроби. Найдите их сумму или разность.

 

Вход. В каждой строке задан пример на сложение или вычитание дробей. Числитель и знаменатель каждой дроби является натуральным числом, не большим 109.

 

Выход. Для каждого входного примера выведите в отдельной строке ответ в виде несократимой дроби. В случае отрицательного ответа следует вывести знак минус перед дробью.

 

Пример входа

Пример выхода

1/2 + ¾

4/5 - 7/3

3/2 + 5/6

7/6 - 1/6

3/2 - 3/2

5/4

-23/15

7/3

1/1

0/1

 

 

РЕШЕНИЕ

математика

 

Анализ алгоритма

Для сложения дробей воспользуемся формулой:

После чего следует сократить дробь.

 

Реализация алгоритма

Вычисление модуля числа.

 

long long abs(long long x)

{

  return (x < 0) ? -x : x;

}

 

Вычисление наибольшего общего делителя.

 

long long gcd(long long a, long long b)

{

  return (!b) ? a : gcd(b, a % b);

}

 

Сложение дробей a / c + b / d = u / v.

 

void add(long long a, long long b, long long c, long long d,

         long long &u, long long &v)

{

  u = a * d + b * c;

  v = b * d;

  g = gcd(abs(u), abs(v));

  u /= g; v /= g;

}

 

Вычитание дробей a / c b / d = u / v.

 

void sub(long long a, long long b, long long c, long long d,

         long long &u, long long &v)

{

  u = a * d - b * c;

  v = b * d;

  g = gcd(abs(u), abs(v));

  u /= g; v /= g;

}

 

Основная часть программы. Читаем входные данные. Обрабатываем запрос и выводим ответ.

 

while (scanf("%lld/%lld %c %lld/%lld", &a, &b, &ch, &c, &d) == 5)

{

  if (ch == '+') add(a, b, c, d, u, v);

  else sub(a, b, c, d, u, v);

  printf("%lld/%lld\n", u, v);

}

 

Java реализация

 

import java.util.*;

 

class MyLong

{

  private long a;

 

  MyLong(long a)

  {

    this.a = a;

  }

 

  MyLong(Long a)

  {

    this.a = a;

  }

 

  MyLong Abs()

  {

    return new MyLong((this.a > 0) ? this.a : -this.a);

  }

 

  long GetValue()

  {

    return this.a; 

  }

 

  private static long gcd(long a, long b)

  {

    if (a == 0) return b;

    if (b == 0) return a;

    if (a > b) return gcd(a%b,b);

    return gcd(a,b%a);

  }

 

  static MyLong gcd(MyLong a, MyLong b)

  {

    return new MyLong(gcd(a.Abs().GetValue(),b.Abs().GetValue()));      

  }

 

  MyLong Add(MyLong a)

  {

    return new MyLong(this.a + a.a);

  }

 

  MyLong Sub(MyLong a)

  {

    return new MyLong(this.a - a.a);

  }

 

  MyLong Mult(MyLong a)

  {

    return new MyLong(this.a * a.a);

  }

 

  MyLong Divide(MyLong a)

  {

    return new MyLong(this.a / a.a);

  } 

 

  public String toString()

  {

    return String.valueOf(a);

  }

}

 

class Fraction

{

  MyLong numerator, denominator;

 

  Fraction ()

  {

    this.numerator = new MyLong(0);

    this.denominator = new MyLong(1);

  }

 

  Fraction (MyLong numerator, MyLong denominator)

  {

    this.numerator = numerator;

    this.denominator = denominator;

  }

 

  Fraction(String s)

  {

    numerator =  new MyLong(Long.parseLong(s.substring(0,s.indexOf('/'))));

    denominator = new MyLong(Long.parseLong(s.substring(s.indexOf('/')+1)));

  }

 

  Fraction Add(Fraction a)

  {

    MyLong x = this.numerator.Mult(a.denominator).Add(this.denominator.Mult(a.numerator));

    MyLong y = this.denominator.Mult(a.denominator);

    MyLong gcd = MyLong.gcd(x, y);

    return new Fraction(x.Divide(gcd),y.Divide(gcd));

  }

 

  Fraction Sub(Fraction a)

  {

    MyLong x = this.numerator.Mult(a.denominator).Sub(this.denominator.Mult(a.numerator));

    MyLong y = this.denominator.Mult(a.denominator);

    MyLong gcd = MyLong.gcd(x, y);

    return new Fraction(x.Divide(gcd),y.Divide(gcd));

  }

 

  public String toString()

  {

    return numerator + "/" + denominator;

  }

}

 

public class Main

{

  public static void main(String[] args)

  {

    Scanner con = new Scanner(System.in);

    while(con.hasNext())

    {

      Fraction a = new Fraction(con.next());

      char ch = con.next().charAt(0);

      Fraction b = new Fraction(con.next());

      Fraction res;

      if (ch == '+')

        res = a.Add(b);

      else

       res = a.Sub(b);

      System.out.println(res);

    }

    con.close();

  }

}

 

Python реализация

 

import sys

from fractions import Fraction

 

for s in sys.stdin:

  x, s, y = s.split()

  a, b = map(int,x.split("/"))

  p = Fraction(a,b)

  a, b = map(int,y.split("/"))

  q = Fraction(a,b)

  if s == "+": res = p + q

  else: res = p – q

  # print(res)

  print(str(res.numerator) + "/" + str(res.denominator))