分数的四则运算

一 分数的表示和化简

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值