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 }
原文:https://www.cnblogs.com/blue-lin/p/11140446.html