分数的四则运算是指,给定两个分数的分子和分母,求它们加减乘除的结果。
一、分数的表示和化简
1.分数的表示
对于一个分数来说,最简洁的写法就是写成假分数的形式,因此可以用一个结构体来储存。
1 2 3 4
| struct Fraction{ int up; int down; };
|
指定规则如下:
- down 为非负数
- 若分数为 0 ,令 up = 0 , down = 1
- 分子和分母应该没有除 1 以外的公约数
2.分数的化简
分数的化简只要是使分数符合上面的三条规则,因此化简步骤:
- 若 down 为负,则 up 和 down 同时取反
- 若 up 为 0 ,则令 down 为 1
- 求出 |up| 和 |down| 的最大公约数,令 up 和 down 同时除以它
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
| struct Fraction reduction(struct Fraction result){ if (result.down < 0){ result.up = -result.up; result.down = -result.down; } if (result.up == 0) result.down = 1; else{ int d = gcd(abs(result.up), abs(result.down)); result.up /= d; resule.down /= d; } return result; }
|
二、分数的四则运算
1.加法
1 2 3 4 5 6 7
| struct Fraction add(struct Fraction f1, struct Fraction f2){ struct Fraction result; result.up = f1.up * f2.down + f2.up * f1.down; result.down = f1.down * f2.down; result = reduction(result); return result; }
|
2.减法
1 2 3 4 5 6 7
| struct Fraction minu(struct Fraction f1, struct Fraction f2){ struct Fraction result; result.up = f1.up * f2.down - f2.up * f1.down; result.down = f1.down * f2.down; result = reduction(result); return result; }
|
3.乘法
1 2 3 4 5 6 7
| struct Fraction multi(struct Fraction f1, struct Fraction f2){ struct Fraction result; result.up = f1.up * f2.up; result.down = f1.down * f2.down; result = reduction(result); return result; }
|
4.除法
1 2 3 4 5 6 7
| struct Fraction divide(struct Fraction f1, struct Fraction f2){ struct Fraction result; result.up = f1.up * f2.down; result.down = f1.down * f2.up; result = reduction(result); return result; }
|
三、分数的输出
有几个注意点:
- 输出分数前,需要先对其进行化简
- 若 down 为 1 ,说明该分数是整数
- 若 |up| > |down| ,说明该分数是假分数,可以先输出整数部分,再输出分数部分
代码如下:
1 2 3 4 5 6 7
| void showResult(struct Fraction r){ r = reduction(r); if (r.down == 1) printf("%d", r.up); else if(abs(r.up) > r.down) printf("%d %d/%d", r.up / r,down, abs(r.up) % r.down, r.down); else printf("%d/%d", r.up, r.down); }
|
参考