分数的运算
#include <cstdio>
#include <cmath>
struct fraction
{
int up;
int down;
};
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
fraction reduction(fraction result)
{
if (result.down < 0)
{
result.up = -result.up;
result.down = -result.down;
}
if (result.up == 0)
result.down = 1;
else
{
int d = gcd(abs(result.up), abs(result.down));
result.up /= d;
result.down /= d;
}
return result;
}
fraction add(fraction f1, fraction f2)
{
fraction result;
result.up = f1.up * f2.down + f2.up * f1.down;
result.down = f1.down * f2.down;
return reduction(result);
}
fraction sub(fraction f1, fraction f2)
{
fraction result;
result.up = f1.up * f2.down - f2.up * f1.down;
result.down = f1.down * f2.down;
return reduction(result);
}
fraction mul(fraction f1, fraction f2)
{
fraction result;
result.up = f1.up * f2.up;
result.down = f1.down * f2.down;
return reduction(result);
}
fraction div(fraction f1, fraction f2)
{
fraction result;
result.up = f1.up * f2.down;
result.down = f1.down * f2.up;
return reduction(result);
}
void print(fraction result)
{
if (result.down == 1) printf("%d\n", result.up);
else if (result.up == result.down) printf("1\n");
else if (result.up > result.down) printf("%d %d %d\n", result.up / result.down, abs(result.up) % result.down, result.down);
else printf("%d %d\n", result.up, result.down);
}
int main()
{
fraction a,b;
while (scanf_s("%d%d%d%d",&a.up,&a.down,&b.up,&b.down) != EOF)
{
print(add(a, b));
print(sub(a, b));
print(mul(a, b));
print(div(a, b));
}
return 0;
}