分数的四则运算

来源:互联网 发布:网站域名申请流程 编辑:程序博客网 时间:2024/06/04 19:21

一 分数的表示和化简

1 分数的表示

对一个分数来说,最简洁的写法就是写成假分数的形式,即无论分子比分母大或者小,都保留其原数。因此可以用一个结构体来存储这种只有分子和分母的分数:

struct Fraction///结构体表示一个分数  {      int up; ///分子      int down;///分母  };  
于是可以定义Fraction 类型的变量来表示分数,或者定义一个结构体数组来定义一堆分数。其中需要对这种表示制定三项规则:

(1) 使down 为非负数。如果分数为负,那么令分子 up 为负即可。

(2) 如果分数恰为零,那么规定其分子为0,分母为 1.

(3) 分子和分母没有除了 1 之外的公约数


2 分数的化简

分数的化简主要用来使 Fraction 变量满足分数表示的三项规定,因此化简的步骤也可分为以下三步:

(1) 如果分母 down 为负数,那么令分子 up 和分母 down 都变为相反数。

(2) 如果分子 up为 0,那么另分母 down为 1;

(3)约分:求出分子绝对值与分母绝对值的最大公约数 d ,然后令分子分母同时除以 d 。

代码如下:

Fraction reduction(Fraction result)///分数化简  {      if(result.down<0)///使分母为非负数,如果分数为负,使分子为负      {          result.up=-result.up;          result.down=-result.down;      }      if(result.up==0)///如果分数为0,规定其分子为0,分母为 1      {          result.down=1;      }      else   ///化成最简分数      {          int d=gcd(abs(result.up),abs(result.down));          result.up/=d;          result.down/=d;      }      return result;  }  

二 分数的四则运算

1 分数的加法

对两个分数 f1 和 f2,其加法的计算公式为:

result=f1.upf2.down+f2.upf1.downf1.downf2.down
代码如下:

Fraction add(Fraction f1,Fraction f2)///分数的加法  {      Fraction result;      result.up=f1.up*f2.down+f1.down*f2.up;      result.down=f1.down*f2.down;      return reduction(result);  }  
2 分数的减法

对两个分数 f1 和 f2,其减法的计算公式为:

result=f1.upf2.downf2.upf1.downf1.downf2.down
代码如下:

Fraction minu(Fraction f1,Fraction f2)///分数的减法  {      Fraction result;      result.up=f1.up*f2.down-f1.down*f2.up;      result.down=f1.down*f2.down;      return reduction(result);  }  

3 分数的乘法

对两个分数 f1 和 f2,其乘法的计算公式为:

result=f1.upf2.upf1.downf2.down
代码如下:

Fraction multi(Fraction f1,Fraction f2)///分数的乘法  {      Fraction result;      result.up=f1.up*f2.up;      result.down=f1.down*f2.down;      return reduction(result);  }  

4 分数的除法

对两个分数f1 和 f2 ,其除法的计算公式为:

result=f1.upf2.downf1.downf2.up
代码如下:

Fraction divide(Fraction f1,Fraction f2)///分数的除法  {      Fraction result;      result.up=f1.up*f2.down;      result.down=f1.down*f2.up;      return reduction(result);  }  

三 分数的输出

分数的输出要根据题目的需要进行输出,但是大体上有以下几个注意点:

(1) 输出分数前,需要对其进行化简

(2) 如果分数 r 的分母 down 为 1,说明该分数是整数,一般来说题目会要求直接输出分子,而省略分母的输出

(3) 如果分数 r 的分子 up 的绝对值大于分母 down ,说明该分数是假分数,此时应该按 带分数的形式输出,即整数部分为 r.up/r.down, 分子部分为 abs(r.up)%r.down, 分母部分为 r.down.

(4) 以上均不满足时说明分数 r 是真分数,按原样输出即可。

以下是一个输出示例:

void showResult(Fraction r)///分数的输出  {      r=reduction(r);   ///化简      if(r.down==1) printf("%d\n",r.up);///整数      else if(abs(r.up)>r.down)///若分数为假分数      {          printf("%d %d/%d\n",r.up/r.down,abs(r.up)%r.down,r.down);      }      else      {          printf("%d/%d\n",r.up,r.down);      }  }  

强调一点: 由于分数的乘法和除法过程中可能使分子或分母超过 int 型的范围,因此一般情况下,分子和分母应使用long long 型存储。


     result=




result=f1.upf2.upf1.downf