做起来确实很长,注意全部要用long long,否则很多测试点通不过。
#include<cstdio>
#include<algorithm>
using namespace std;
int gcd(long long a, long long b)
{
if (b == 0) return a;
else return gcd(b,a%b);
}
struct fraction
{
long long up, down;
}a,b;
fraction reduction(fraction result)
{
if (result.up == 0) result.down = 1;
else
{
long long x = gcd(abs(result.up), result.down);
result.up /= x;
result.down /= x;
}
return result;
}
void showresult(fraction a)
{
if (a.up > 0)
{
if (a.down == 1) printf("%lld", a.up);
else if (a.up > a.down)
{
printf("%lld %lld/%lld", a.up / a.down, abs(a.up%a.down), a.down);
}
else if (a.up == a.down) printf("%lld", a.up);
else printf("%lld/%lld", a.up, a.down);
}
else if (a.up == 0) printf("0");
else
{
printf("(");
if (a.down == 1) printf("%lld", a.up);
else if (abs(a.up) > a.down)
{
printf("%lld %lld/%lld", a.up / a.down, abs(a.up%a.down), a.down);
}
else if (a.up == a.down) printf("%lld", a.up);
else printf("%lld/%lld", a.up, a.down);
printf(")");
}
}
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 mins(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 mult(fraction a, fraction b)
{
fraction result;
result.up = a.up*b.up;
result.down = a.down*b.down;
return reduction(result);
}
fraction div(fraction a, fraction b)
{
fraction result;
result.up = a.up*b.down;
result.down = a.down*b.up;
if (result.down < 0)
{
result.up = -result.up;
result.down = -result.down;
}
return reduction(result);
}
int main()
{
scanf("%lld/%lld %lld/%lld", &a.up, &a.down, &b.up, &b.down);
a = reduction(a), b = reduction(b);
showresult(a);
printf(" + ");
showresult(b);
printf(" = ");
showresult(add(a, b));
printf("\n");
showresult(a);
printf(" - ");
showresult(b);
printf(" = ");
showresult(mins(a, b));
printf("\n");
showresult(a);
printf(" * ");
showresult(b);
printf(" = ");
showresult(mult(a, b));
printf("\n");
showresult(a);
printf(" / ");
showresult(b);
printf(" = ");
if (b.up == 0) printf("Inf");
else showresult(div(a, b));
printf("\n");
return 0;
}