1. 分数的定义
定义一个结构体,内含分母和分子两个整型元素。
1 struct F{ 2 int up, down; 3 };
2. 特殊情况的规定
-
当分数为负分数时,我们规定分子为负数,分母为正数。也就是说,当分母为负时,对分子分母同时取反。
-
当分数为 0 时
-
当分数不是最简式时,求出分子分母的最大公约数
d
,将分子分母同时除以d
得到最简分式。具体步骤见下一节“分数的化简”。 -
当分数为假分数时(即分子大于分母),
3. 分数的化简
在这里我们实现第二节“特殊情况的规定”中前三点。
F reduction(int up, int down){ int d = 1; F result; // 分母小于 0,分子分母同时取反 if(down < 0){ up = -up; down = -down; } // 分式等于 0,使分母为 1 if(up == 0){ down = 1; }else{ // 求出分子分母的最大公约数 if(up > down){ d = gcd(up, down); }else{ d = gcd(down, up); } } // 将分子分母除以他们的最大公约数,得到最简分式 result.up = up / d, result.down = down / d; return result; }
4. 分式的四则运算
这个其实很简单,只需要模拟我们平时生活中计算分式的方法即可。需要注意一点是两个分式计算完毕之后需要化简为最简分式。这里我只实现两个分式的加运算,其余三个懒不想写可以留作练习。
F add(F a, F b){ // 设两个分式 A = a/b 和 B = c/d,那么 // A + B = (a * d + b * c) / b * d // 也就是先通分,然后分子相加,注意这一步我们把计算结果化为最简分式了 return reduction(a.up * b.down + b.up * a.down, a.down * b.down); }
5. 分式的输出
需要分以下几种情况讨论:
-
分母为一,也就是为整数的情况,一般只需要输出分子
-
假分数(分子大于分母),多出来的一部分整数为
分子/分母
,原分式的分子变为 abs(分子 % 分母),分母不变 -
真分数,直接输出即可
看代码:
void print_fraction(F f){ if(f.down == 1){ // 整数 printf("%d\n", f.up); }else if(f.up > f.down){ // 假分数 printf("%d %d/%d\n", f.up / f.down, abs(f.up % f.down), f.down); }else{ // 真分数 printf("%d/%d\n", f.up, f.down); } }
表示分数的思想很简单,就是模拟现实生活中的分数表示方法。
附上全部代码:
#include <cstdio> #include <cmath> using namespace std; struct Fraction{ int up, down; }; int gcd(int a, int b){ return !b ? a : gcd(b, a % b); } Fraction get_fraction(int up, int down){ int d = 1; Fraction res; if(down < 0){ down = -down; up = - up; } if(up == 0){ down = 1; }else{ if(up > down){ d = gcd(up, down); }else{ d = gcd(down, up); } } res.up = up / d, res.down = down / d; return res; } Fraction add(Fraction a, Fraction b){ return get_fraction(a.up * b.down + b.up * a.down, a.down * b.down); } Fraction sub(Fraction a, Fraction b){ return get_fraction(a.up * b.down - b.up * a.down, a.down * b.down); } Fraction mul(Fraction a, Fraction b){ return get_fraction(a.up * b.up, a.down * b.down); } Fraction div(Fraction a, Fraction b){ return get_fraction(a.up * b.down, a.down * b.up); } void prt_fraction(Fraction f){ if(f.down == 1){ printf("%d\n", f.up); }else if(f.up > f.down){ printf("%d %d/%d\n", f.up / f.down, abs(f.up % f.down), f.down); }else{ printf("%d/%d\n", f.up, f.down); } } int main(){ Fraction a, b; a = get_fraction(12, 24), b= get_fraction(5, 12); prt_fraction(add(a, b)); prt_fraction(sub(a, b)); prt_fraction(mul(a, b)); prt_fraction(div(a, b)); return 0; }