使用long long型防止浮点数溢出
//
// main.cpp
// PATA1088
//
// Created by Phoenix on 2018/2/20.
// Copyright © 2018年 Phoenix. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
struct node {
long long a;
long long b;
};
long long gcd(long long a, long long b) {
while (a % b != 0) {
long long c = b;
b = a % b;
a = c;
}
return b;
}
node simply(node x) {
if(x.a == 0) x.b = 1;
long long k = gcd(x.a, x.b);
x.a /= k;
x.b /= k;
if(x.b < 0) {
x.a *= -1;
x.b *= -1;
}
return x;
}
void print(node x) {
if(x.b == 0) printf("Inf");
else{
x = simply(x);
bool flag = false;
if(x.a < 0) flag = true;
if(flag) printf("(");
if(x.a % x.b == 0) {
printf("%lld", x.a / x.b);
} else {
if(abs(x.a) > abs(x.b)) {
printf("%lld %lld/%lld", x.a / x.b, abs(x.a % x.b), x.b);
} else {
printf("%lld/%lld", x.a, x.b);
}
}
if(flag) printf(")");
}
}
void add(node a, node b) {
node ans;
ans.a = a.a * b.b + a.b * b.a;
ans.b = a.b * b.b;
ans = simply(ans);
print(a);
printf(" + ");
print(b);
printf(" = ");
print(ans);
printf("\n");
}
void sub(node a, node b) {
node ans;
ans.a = a.a * b.b - a.b * b.a;
ans.b = a.b * b.b;
ans = simply(ans);
print(a);
printf(" - ");
print(b);
printf(" = ");
print(ans);
printf("\n");
}
void product(node a, node b){
node ans;
ans.a = a.a * b.a;
ans.b = a.b * b.b;
ans = simply(ans);
print(a);
printf(" * ");
print(b);
printf(" = ");
print(ans);
printf("\n");
}
void quotient(node a, node b) {
if(b.a == 0) {
print(a);
printf(" / ");
print(b);
printf(" = Inf\n");
}else{
node ans;
ans.a = a.a * b.b;
ans.b = a.b * b.a;
ans = simply(ans);
print(a);
printf(" / ");
print(b);
printf(" = ");
print(ans);
printf("\n");
}
}
int main(int argc, const char * argv[]) {
node a, b;
scanf("%lld/%lld %lld/%lld", &a.a, &a.b, &b.a, &b.b);
simply(a);
simply(b);
add(a, b);
sub(a, b);
product(a, b);
quotient(a, b);
return 0;
}