9426. Дроби: умножение
и деление
Даны две дроби. Найдите их произведение или частное.
Вход. В каждой строке задан пример на умножение или деление
дробей. Числитель и знаменатель каждой дроби является натуральным числом, не
большим 109.
Выход. Для каждого входного примера выведите в отдельной
строке ответ в виде несократимой дроби.
Пример входа |
Пример выхода |
2/3 * 5/6 1/2 / 4/5 7/8 * 11/41 7/1 / 3/7 |
5/9 5/8 77/328 49/3 |
математика
Для умножения дробей
воспользуемся формулой:
,
после чего следует сократить
дробь.
Деление на дробь эквивалентно
умножению на обратную дробь:
Вычисление модуля числа.
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 mult(long long a, long long b, long long c, long long d,
long long &u, long long &v)
{
u = a * c;
v = b * d;
g = gcd(abs(u), abs(v));
u /= g; v /= g;
}
Деление дробей a / c : b / d = u
/ v.
void div(long long a, long long b, long long c, long long d,
long long &u, long long &v)
{
u = a * d;
v = b * c;
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 == '*') mult(a, b, c, d, u, v);
else div(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;
}
}
class FractionMultDiv extends Fraction
{
FractionMultDiv(String s)
{
super(s);
}
FractionMultDiv(MyLong numerator, MyLong denominator)
{
super(numerator, denominator);
}
FractionMultDiv
Mult(Fraction a)
{
MyLong x = this.numerator.Mult(a.numerator);
MyLong y = this.denominator.Mult(a.denominator);
MyLong gcd = MyLong.gcd(x, y);
return new
FractionMultDiv(x.Divide(gcd),y.Divide(gcd));
}
FractionMultDiv
Divide(Fraction a)
{
MyLong x = this.numerator.Mult(a.denominator);
MyLong y = this.denominator.Mult(a.numerator);
MyLong gcd = MyLong.gcd(x, y);
return new
FractionMultDiv(x.Divide(gcd),y.Divide(gcd));
}
}
public class Main
{
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
while(con.hasNext())
{
FractionMultDiv a = new
FractionMultDiv(con.next());
char ch = con.next().charAt(0);
FractionMultDiv b = new
FractionMultDiv(con.next());
FractionMultDiv res;
if (ch == '*')
res = a.Mult(b);
else
res = a.Divide(b);
System.out.println(res);
}
con.close();
}
}