#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <sstream>
#include <string>
using namespace std;
long long gsd(long long a, long long b){
while (a > 0 && b > 0) {
if (a > b) {
a %= b;
} else {
b %= a;
}
}
return (a+b);
}
class Rational {
public:
Rational() {
numerator=0;
denominator=1;
}
Rational(int n, int d) {
if (d==0)
throw invalid_argument("invalid_argument");
if (n==0){
numerator=0;
denominator=1;
}
else{
int p=gsd(abs(n), abs(d));
if (n*d<0){
numerator=-1*abs(n)/p;
denominator=abs(d)/p;
}
else{
numerator=abs(n)/p;
denominator=abs(d)/p;
}
}
}
long long Numerator() const {
return numerator; // Реализуйте этот метод
}
long long Denominator() const {
return denominator; // Реализуйте этот метод
}
private:
int numerator;
int denominator; // Добавьте поля
};
Rational DoRation(int h, int m){
return Rational(h,m);
}
Rational operator+(const Rational& lhs, const Rational& rhs ){
return Rational(lhs.Numerator()*rhs.Denominator()+rhs.Numerator()*lhs.Denominator(), lhs.Denominator()*rhs.Denominator());
}
Rational operator-(const Rational& lhs, const Rational& rhs ){
return Rational(lhs.Numerator()*rhs.Denominator()-rhs.Numerator()*lhs.Denominator(), lhs.Denominator()*rhs.Denominator());
}
bool operator==(const Rational& lhs, const Rational& rhs ){
return (lhs.Numerator()==rhs.Numerator()&& lhs.Denominator()==rhs.Denominator());
}
Rational operator/(const Rational& lhs, const Rational& rhs ){
if (rhs.Numerator()==0) throw domain_error("domain_error");
Rational ac (lhs.Numerator(), rhs.Numerator()); //a/c
Rational db (rhs.Denominator(), lhs.Denominator()); //d/b //a*d/b*c
return Rational(ac.Numerator()*db.Numerator(), ac.Denominator()*db.Denominator());
}
Rational operator*(const Rational& lhs, const Rational& rhs ){
Rational ad (lhs.Numerator(), rhs.Denominator()); //a/d
Rational cb (rhs.Numerator(), lhs.Denominator()); //c/b //a*c/d*b
return Rational(ad.Numerator()*cb.Numerator(), ad.Denominator()*cb.Denominator());
}
bool operator<(const Rational& lhs, const Rational& rhs ){
return (lhs-rhs).Numerator()<0;
}
ostream& operator<<(ostream& stream, const Rational& rational) {
stream << rational.Numerator() << '/'
<< rational.Denominator();
return stream;
}
istream& operator>>(istream& stream, Rational& r) {
char s;
int p, q;
if (stream >> p && stream>>s && s=='/' && stream >> q)
r = { p, q };
else throw invalid_argument("invalid_argument");
return stream;
}
int main() {
Rational r1, r2;
char op;
try {
cin>>r1>>op>>r2;
if (op=='+') cout<<r1+r2<<endl;
if (op=='-') cout<<r1-r2<<endl;
if (op=='*') cout<<r1*r2<<endl;
if (op=='/'){
try{
cout<<r1/r2;
} catch(domain_error&){
cout<<"Division by zero";
}
}
} catch (invalid_argument&) {
cout<<"Invalid argument";
}
return 0;
}