-
Notifications
You must be signed in to change notification settings - Fork 71
/
Copy path1034_有理数四则运算 (20).cpp
116 lines (102 loc) · 2.77 KB
/
1034_有理数四则运算 (20).cpp
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/**
* 练习C++符号重载,参考《C++ Primer》
* 注意溢出,使用64位整数
* Fraction 类
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long int64;
int64 gcd(int64 a, int64 b) {
a = abs(a);
b = abs(b);
return b == 0 ? a : gcd(b, a%b);
}
class Fraction {
public:
int64 numerator, denominator;
int state;
// read number
Fraction(int64 a, int64 b, bool state = true) {
this->state = state;
if (state) {
if (a % b == 0) {
numerator = a / b;
denominator = 1;
}
else {
int64 c_d = gcd(a, b);
numerator = a / c_d;
denominator = b / c_d;
}
}
}
friend Fraction operator+ (const Fraction &lhs, const Fraction &rhs) {
int64 a = lhs.numerator * rhs.denominator + rhs.numerator * lhs.denominator;
int64 b = lhs.denominator * rhs.denominator;
int64 c_d = gcd(a, b);
return Fraction(a / c_d, b / c_d);
}
friend Fraction operator- (const Fraction &lhs, const Fraction &rhs) {
int64 a = lhs.numerator * rhs.denominator - rhs.numerator * lhs.denominator;
int64 b = lhs.denominator * rhs.denominator;
int64 c_d = gcd(a, b);
return Fraction(a / c_d, b / c_d);
}
friend Fraction operator* (const Fraction &lhs, const Fraction &rhs) {
int64 a = lhs.numerator * rhs.numerator;
int64 b = lhs.denominator * rhs.denominator;
int64 c_d = gcd(a, b);
return Fraction(a / c_d, b / c_d);
}
friend Fraction operator/ (const Fraction &lhs, const Fraction &rhs) {
int64 a = lhs.numerator * rhs.denominator;
int64 b = lhs.denominator * rhs.numerator;
if (b < 0) { a *= -1; b *= -1; }
int64 c_d = gcd(a, b);
if (b == 0) return Fraction(a / c_d, b / c_d, false);
else return Fraction(a / c_d, b / c_d);
}
friend ostream& operator << (ostream &os, const Fraction &f) {
if (f.state) {
bool bracket = false;
if (f.numerator < 0) bracket = true;
if (f.denominator == 1) {
if (bracket) os << "(" << f.numerator << ")";
else os << f.numerator;
}
else {
if (bracket) os << "(";
if (f.numerator / f.denominator != 0) os << f.numerator / f.denominator << " ";
else if (f.numerator < 0) os << "-";
os << abs(f.numerator) % f.denominator << "/" << f.denominator;
if (bracket) os << ")";
}
}
else {
os << "Inf";
}
return os;
}
};
int main() {
int64 a, b, c, d;
scanf("%lld/%lld %lld/%lld", &a, &b, &c, &d);
Fraction num1(a, b), num2(c, d);
cout << num1 << " + " << num2 << " = " << num1 + num2 << endl;
cout << num1 << " - " << num2 << " = " << num1 - num2 << endl;
cout << num1 << " * " << num2 << " = " << num1*num2 << endl;
cout << num1 << " / " << num2 << " = " << num1 / num2 << endl;
return 0;
}
/* Test Case
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)
5/3 0/6
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf
*/