1 相信同学们对复数运算符重载已经相当熟悉啦,那今天那我们来看看分数又该如何处理呢?定义一个分数类FS,有私有成员分子fz,分母fm。另有公有成员函数FS operator + (const FS &f)对运算符“+”进行重载,实现两个分数相加。题目首先给出一个整型数n,紧跟着2n行输入,输入形如3z4m,代表分子为3,分母为4。其中分母不为0,输入时分母可以为负数,但输出时分母必须为正数。
2 要求对分数进行两两求和,并化简。(备注说明:分数为0时,表示成0z1m,如果结果为负数,那么分子取负数,分母为正数)
1 #include <iostream>
2 using namespace std;
3 void HJ(int &fz, int &fm)
4 {
5 int gy = 1;
6 while ((gy < fz) || (gy < fm))
7 {
8 gy++;
9 if (((fz % gy) == 0) && ((fm % gy) == 0))
10 {
11 fz /= gy;
12 fm /= gy;
13 }
14 }
15
16 }
17 class FS
18 {
19 friend void operator >>(istream& cin, FS& fs);
20 public:
21 FS operator+(FS& f)
22 {
23 if (this->fm < 0)
24 {
25 this->fm = -this->fm;
26 this->fz = -this->fz;
27 }
28 if (f.fm < 0)
29 {
30 f.fm = -f.fm;
31 f.fz = -f.fz;
32 }
33 if (this->fm == f.fm)
34 {
35 int fz = this->fz + f.fz;
36 int fm = this->fm;
37 HJ(fz,fm);
38 cout << fz << "z" << fm << "m" << endl;
39 }
40 else if (this->fz == 0 || f.fz == 0)
41 {
42 cout << "0z1m" << endl;
43 }
44 else
45 {
46 int fz = (this->fz * f.fm) + (this->fm * f.fz);
47 int fm = this->fm * f.fm;
48 HJ(fz,fm);
49 cout << fz << "z" << fm << "m" << endl;
50 }
51 return f;
52 }
53 private:
54 int fz;
55 int fm;
56 };
57 void operator >>(istream& cin, FS& fs)
58 {
59 char Z;
60 char M;
61 cin >> fs.fz >> Z >> fs.fm >> M;
62 }
63 void test01()
64 {
65 int n = 0;
66 cin >> n;
67 FS fs[6];
68 for (int i = 0; i < 2 * n; i++)
69 {
70 cin >> fs[i];
71 }
72 for (int j = 0; j < 2 * n; j += 2)
73 {
74 fs[j] + fs[j + 1];
75 }
76 }
77 int main()
78 {
79 test01();
80 return 0;
81 }