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);
}
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();
}
}
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))