分数的四则运算

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 }

 

posted @ 2019-07-05 19:36  林東雨  阅读(1520)  评论(0编辑  收藏  举报