【PAT笔记】数学问题——分数的四则运算

分数的四则运算是从小学开始接触,运算规则和原理大家应该都很清楚了。我们现在要做的就是如何通过程序,让计算机来做分数的四则运算。

1 分数的表示

首先来表示一个分数,最简单的就是用假分数表示了,也就是无论分子比分母大还是比分母小,都保留原数。那么就可以通过设置一个结构体来存储这种只有分子和分母的分数了。

struct Fraction{
    int up,down;
};

2 分数的化简

在这里我采用《算法笔记》的定义方式来写。首先,我们要是Fraction变量满足三项规定,因此化简步骤也可以分为三步:

  1. 如果分母是负数,那么把分子up和分母down同时变为相反数;
  2. 如果分子up等于0,那么把分母down变为1;
  3. 约分:求出分子绝对值(思考为什么要加这里要加绝对值)和分母绝对值的最大公约数,然后令分子和分母同时除以d。

在正式给出分数化简算法代码之前,我对第三步做一个说明,也就是说,怎么求两个数的最大公约数和最小公倍数。

最大公约数 

在建立的数学理论之上(如果不能理解这两个数学术语的同学请自行百度或者Google),我们可以通过递归式来解决。两个递归的关键是:

  1. 递归式:gcd(a,b)=gcd(b,a%b);
  2. 递归边界:gcd(a,0)=a

很明显可以看出用了交换递归思想,于是可以得到下面的函数代码:

int gcd(int a,int b){
    if(b==0) return a;
    else return gcd(b,a%b);
}

 最小公倍数

最小公倍数在数学上的表达式为:a*b/gcd(a,b) ,即a和b的乘积除以a和b的最大公约数即为a和b的最小公倍数。

收回来,解决了约分这个步骤,那么我们开始来写分数简化的代码。

Fraction reduction(Fraction result){
    if(result.down<0){  //第一步,如果当分母为负数的时候
        result.up=-result.up;
        result.down=-result.down;
    }
    if(result.up==0){    //第二步,如果当分子为0的时候
        result.down=1;
    }
    else{
        int y=gcd(abs(result.up),abs(result.down));  //第三步,约分,其中gcd函数要体现写好
        result.up=result.up/y;
        result.down=result.down/y;
    }
    return result;
}

下面开始进行分数四则运算的思想和代码展示:

3 分数的加法

数学思想的公式体现:  result=\frac{f1.up*f2.down+f2.up*f1.dowm}{f1.down*f2.down}

那么就可以得到一下代码:

Fraction add(Fraction f1,Fraction f2){
    Fraction result;    //用result存储分数形式的值
    result.up=f1.up*f2.down+f2.up*f1.down;   
    result.down=f1.down*f2.down;    //分子和分母的计算
    return reduction(result);       //用reduction函数化简分数result
}

4 分数的减法

数学思想的公式体现:  result=\frac{f1.up*f2.down-f2.up*f1.dowm}{f1.down*f2.down}

那么就可以得到一下代码: 

Fraction minu(Fraction f1,Fraction f2){
    Fraction result;    //用result存储分数形式的值
    result.up=f1.up*f2.down-f2.up*f1.down;   
    result.down=f1.down*f2.down;    //分子和分母的计算
    return reduction(result);       //用reduction函数化简分数result
}

 5 分数的乘法

数学思想的公式体现:  result=\frac{f1.up*f2.up}{f1.down*f2.down}

那么就可以得到一下代码: 

Fraction multi(Fraction f1,Fraction f2){
    Fraction result;    //用result存储分数形式的值
    result.up=f1.up*f2.up;   
    result.down=f1.down*f2.down;    //分子和分母的计算
    return reduction(result);       //用reduction函数化简分数result
}

6 分数的除法

 数学思想的公式体现:  result=\frac{f1.up*f2.down}{f1.down*f2.up}

那么就可以得到一下代码: 

Fraction divide(Fraction f1,Fraction f2){
    Fraction result;    //用result存储分数形式的值
    result.up=f1.up*f2.down;   
    result.down=f1.down*f2.up;    //分子和分母的计算
    return reduction(result);       //用reduction函数化简分数result
}

总结

观察上面四个分数的四则运算可以看到,分数的四则运算模式很单一,每个函数执行的只有四行代码,其意义也很容易明白:定义一个Fraction型的result来存储运算后的值,对两个分数的分子和分母分别运算,最后用reduction函数化简返回result值。

纵观全局来看,我们要建立一个Fraction分数结构体,然后用约分函数(int gcd())、化简函数(Fraction reduction(Fraction result))以及四则运算函数。于是就可以构成整个算法的模型 

猜你喜欢

转载自blog.csdn.net/xt199711/article/details/88089006