①注意在求最大公因子的时候,分子分母要取绝对值
②输出判断下0和小于0
#define _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct fraction {
ll up, down;
};
ll gcd(ll a,ll b)
{
return b == 0 ? a : gcd(b, a % b);
}
fraction reduction(fraction a)
{
if (a.down < 0)
{
a.down = -a.down;
a.up = -a.up;
}
if (a.up == 0)
{
a.down = 1;
}
else {
int d = gcd(abs(a.up), abs(a.down));
a.up /= d;
a.down /= d;
}
return a;
}
fraction add(fraction a, fraction b)
{
fraction result;
result.up = a.up * b.down + a.down * b.up;
result.down = a.down * b.down;
return reduction(result);
}
fraction difference(fraction a, fraction b)
{
fraction result;
result.up = a.up * b.down - a.down * b.up;
result.down = a.down * b.down;
return reduction(result);
}
fraction product(fraction a, fraction b)
{
fraction result;
result.up = a.up*b.up;
result.down = a.down * b.down;
return result;
}
fraction quotient(fraction a, fraction b)
{
fraction result;
result.up = a.up * b.down;
result.down = a.down * b.up;
return result;
}
void showresult(fraction a)
{
a=reduction(a);
if (a.up < 0)
printf("(");
if (a.down == 1) printf("%lld", a.up);
else if(a.down == 0) printf("Inf");
else if (abs(a.up) > a.down) printf("%lld %lld/%lld", a.up / a.down, abs(a.up) % a.down, a.down);
else
printf("%d/%d", a.up, a.down);
if (a.up < 0)
printf(")");
}
int main()
{
fraction m, n, result;
scanf("%lld/%lld %lld/%lld", &m.up, &m.down, &n.up, &n.down);
result = add(m, n);
showresult(m);
printf(" + ");
showresult(n);
printf(" = ");
showresult(result);
printf("\n");
result = difference(m, n);
showresult(m);
printf(" - ");
showresult(n);
printf(" = ");
showresult(result);
printf("\n");
result = product(m, n);
showresult(m);
printf(" * ");
showresult(n);
printf(" = ");
showresult(result);
printf("\n");
result = quotient(m, n);
showresult(m);
printf(" / ");
showresult(n);
printf(" = ");
showresult(result);
printf("\n");
return 0;
}