1088 Rational Arithmetic

给2个有理数,分别计算它们的相加相减相乘相处后的结果,并按要求格式输出。
重点在这个格式化有理数的函数f。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <bits/stdc++.h>
using namespace std;

long long a, b, c, d;

long long GCD(long long a, long long b) {
return b == 0 ? abs(a) : GCD(b, a % b);
}

void f(long long a, long long b) {
if (a == 0) {
printf("0");
return;
}
if (b == 0) {
printf("Inf");
return;
}
int flag = (a < 0 && b > 0) || (a > 0 && b < 0);
a = abs(a), b = abs(b);
long long integer = a / b;
if (flag) {
printf("(-");
}
if (integer) {
printf("%lld", integer);
}
if (a % b == 0) {
if (flag) {
printf(")");
}
return;
}
if (integer != 0) {
printf(" ");
}
long long gcdval = GCD(a, b);
a = a - integer * b;
a = a / gcdval, b = b / gcdval;
printf("%lld/%lld", a, b);
if (flag) {
printf(")");
}
// printf("%lld/%lld%s", m, n, flag ? ")" : ""); 也很不错
}

int main() {
scanf("%lld/%lld %lld/%lld", &a, &b, &c, &d);
f(a, b);
printf(" + ");
f(c, d);
printf(" = ");
f(a * d + b * c, b * d);
printf("\n");

f(a, b);
printf(" - ");
f(c, d);
printf(" = ");
f(a * d - b * c, b * d);
printf("\n");

f(a, b);
printf(" * ");
f(c, d);
printf(" = ");
f(a * c, b * d);
printf("\n");

f(a, b);
printf(" / ");
f(c, d);
printf(" = ");
f(a * d, b * c);
printf("\n");

return 0;
}

2/3 -4/2

2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)