Date:2019-07-05 19:35:27
算法实现
1 /*-------------------------分数的表示和化简---------------------*/
2 /*
3 1.分数的表示
4 */
5
6 //
7 //1.down非负,若分数为负,则令up为负
8 //2.分数为零,则令up=0, down=1
9 //3.up和down的gcd=1
10 //
11
12 struct fraction //分数
13 {
14 //乘除法过程中,数值可能超过int
15 long up; //分子
16 long down; //分母
17 };
18
19 /*
20 2.分数的化简
21 */
22
23 //1.若down为负,则令up和down都变为相反数
24 //2.若up=0,则令down=1
25 //3.约分:求出up和down的gcd,再令up和down同时除以gcd
26 //
27
28 #include <math.h>
29
30 int gcd(int a, int b)
31 {
32 if(b == 0)
33 {
34 return a;
35 }
36 else
37 {
38 return gcd(b, a%b);
39 }
40 }
41
42 fraction Reduction(fraction result)
43 {
44 if(result.down < 0)
45 {
46 result.up = -result.up;
47 result.down = -result.down;
48 }
49
50 if(result.up == 0)
51 {
52 result.down = 1;
53 }
54 else
55 {
56 int d = gcd(abs(result.up), abs(result.down));
57
58 result.down /= d;
59 result.up /= d;
60 }
61
62 return result;
63 }
64
65 /*---------------------------分数的四则运算----------------------*/
66 /*
67 1.分数的加法
68 */
69
70 fraction Add(fraction f1, fraction f2)
71 {
72 fraction result;
73
74 result.up = f1.up*f2.down + f2.down*f1.up;
75 result.down = f1.down*f2.down;
76
77 //结果可以约分
78 return Reduction(result);
79 }
80
81 /*
82 2.分数的减法
83 */
84
85 fraction Minu(fraction f1, fraction f2)
86 {
87 fraction result;
88
89 result.up = f1.up *f2.down - f2.up*f1.down;
90 result.down = f1.down * f2.down;
91
92 //结果为负
93 return Reduction(result);
94 }
95
96 /*
97 3.分数的乘法
98 */
99
100 fraction Multi(fraction f1, fraction f2)
101 {
102 fraction result;
103
104 result.up = f1.up * f2.up;
105 result.down = f1.down * f2.down;
106
107 //结果可以约分
108 return Reduction(result);
109 }
110
111 /*
112 4.分数的除法
113 */
114
115 fraction Divide(fraction f1, fraction f2)
116 {
117 fraction result;
118
119 result.up = f1.up * f2.down;
120 result.down = f1.down * f2.up;
121
122 return Reduction(result);
123 }
124
125 /*-------------------------------分数的输出----------------------------*/
126
127 //
128 //1.化简先行
129 //2.若down=1,则为整数,按题目要求,可以直接输出分子
130 //3.若abs(up)>down(即为假分数),则以带分数形式输出,整数部分(r.up/r.down),分子部分(abs(r.up)%r.down),分母部分(r.down)
131 //4.else 直接输出
132 //
133
134 #include <stdio.h>
135
136 void ShowResult(fraction r)
137 {
138 r = Reduction(r);
139
140 if(r.down == 1)
141 {
142 printf("%lld", r.up);
143 }
144 else if(abs(r.up) > r.down)
145 {
146 printf("%d %d/%d", r.up/r.down, abs(r.up)%r.down, r.down);
147 }
148 else
149 {
150 printf("%d/%d", r.up, r.down);
151 }
152 }