算法笔记 分数的四则运算

分数的四则运算是指,给定两个分数的分子和分母,求它们加减乘除的结果。

一、分数的表示和化简

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);
}

参考

  • 算法笔记