原题:1088. Rational Arithmetic (20)
解题思路:
按题意计算即可。用公约数一直化成最简,注意数的输出格式,用long long 防溢出。
代码如下:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
long long gcd(long long a, long long b)
{
if(b == 0) return a;
else return gcd(b, a%b);
}
void printNum(long long a, long long b)
{
if((a > 0 && b < 0) || (a < 0 && b < 0))
{
a = -a;
b = -b;
}
if(a < 0) printf("(");
if(b == 1) printf("%lld", a);
else
{
if(abs(a) > abs(b))
printf("%lld %lld/%lld", a/b, abs(a)%abs(b), abs(b));
else
printf("%lld/%lld", a, b);
}
if(a < 0) printf(")");
}
int main()
{
long long a, b, c, d;
while(scanf("%lld/%lld %lld/%lld", &a, &b, &c, &d) == 4)
{
long long g1 = gcd(a, b);
long long g2 = gcd(c, d);
if(g1 > 0)
{
a /= g1;
b /= g1;
}
if(g2 > 0)
{
c /= g2;
d /= g2;
}
long long tmp1, tmp2;
printNum(a, b); printf(" + "); printNum(c, d); printf(" = ");
long long g = gcd(b, d);
tmp1 = d / g * a + b / g * c;
tmp2 = b / g * d;
printNum(tmp1/gcd(abs(tmp1), abs(tmp2)), tmp2/gcd(abs(tmp1), abs(tmp2)));
printf("\n");
printNum(a, b); printf(" - "); printNum(c, d); printf(" = ");
g = gcd(b, d);
tmp1 = d / g * a - b / g * c;
tmp2 = b / g * d;
printNum(tmp1/gcd(abs(tmp1), abs(tmp2)), tmp2/gcd(abs(tmp1), abs(tmp2)));
printf("\n");
printNum(a, b); printf(" * "); printNum(c, d); printf(" = ");
tmp1 = a*c;
tmp2 = b*d;
printNum(tmp1/gcd(abs(tmp1), abs(tmp2)), tmp2/gcd(abs(tmp1), abs(tmp2)));
printf("\n");
printNum(a, b); printf(" / "); printNum(c, d); printf(" = ");
if(c == 0) printf("Inf\n");
else
{
tmp1 = a*d;
tmp2 = b*c;
printNum(tmp1/gcd(abs(tmp1), abs(tmp2)), tmp2/gcd(abs(tmp1), abs(tmp2)));
printf("\n");
}
}
return 0;
}