分数的创建、化简、四则运算与输出————附带C/C++实现代码和示例

时间:2025-03-27 07:19:05

文章目录

  • 1 分数表示和简化
    • 1.1 表示
    • 1.2 分数化简
  • 2 分数的计算
    • 2.1 分数加法
    • 2.2分数减法
    • 2.3 分数的乘法
    • 2.4 分数的除法
  • 3 分数输出
  • 3 完整示例

1 分数表示和简化

1.1 表示

写成假分数的形式,无论分子比分母大或者小,都保留其原数。

struct Fraction//分数
{
    int up, down;//分子、分母
};

用Fraction类型表示分数,或者定义数组表示一堆分数。

制定表示的规则:

  • 1 使down为非负数。如果分数为负数,up为负数即可;
  • 2 如果该分数恰为0,那么规定其分子为0,分母为1;
  • 3 约分:求出分子或分母的最大公约数d,然后令分子、分母同时除以d。

1.2 分数化简

  • 规则:
    • 1 如果分数为负数,分子、分母都变为相反数;
    • 2 如果分子up为0,令分母为1;
    • 3 约分:求出分子绝对值和分母绝对值的最大公约数,然后令分子分母同时除以d。
Fraction reduction(Fraction result){
    if(result.down < 0){//分母为负,分子分母都变为相反数
        result.up = - result.up;
        result.down = - result.down;
    }

    if(result.up == 0){//如果分子为0,令分母为1
        result.down = 1;
    }else{//分子分母不为0,进行约分
        int d = gcd(abs(result.up), abs(result.down));
        result.up /= d;
        result.down /= d;
    }
    return result;
}

2 分数的计算

2.1 分数加法

对于分数f1和f2,加法公式为:
r e s u l t = f 1. u p ∗ f 2. d o w n + f 2. u p ∗ f 1. d o w n f 1. d o w n ∗ f 2. d o w n result = \frac{*+*}{*} result=f1.downf2.downf1.upf2.down+f2.upf1.down

实现代码如下:

Fraction add(Fraction f1, Fraction f2){
    Fraction result;
    result.up = f1.up * f2.down + f2.up *  f1.down;//分数和的分子
    result.down = f1.down * f2.down;//分数和的分母
    return reduction(result);//返回化简后的结果
}

2.2分数减法

对于分数f1和f2,减法公式为:
r e s u l t = f 1. u p ∗ f 2. d o w n − f 2. u p ∗ f 1. d o w n f 1. d o w n ∗ f 2. d o w n result = \frac{*- *}{*} result=f1.downf2.downf1.upf2.downf2.upf1.down

实现代码如下:

Fraction minu(Fraction f1, Fraction f2){
    Fraction result;
    result.up = f1.up * f2.down - f2.up * f1.down;//分数差的分子
    result.down = f1.down * f2.down;//分数差的分母
    return reduction(result);//返回化简后的结果
}

2.3 分数的乘法

对于分数f1和f2,乘法公式为:
r e s u l t = f 1. u p ∗ f 2. u p f 1. d o w n ∗ f 2. d o w n result = \frac{ * }{*} result=f1.downf2.downf1.upf2.up

实现代码如下:

Fraction multi(Fraction f1, Fraction f2){
    Fraction result;
    result.up = f1.up * f2.up;//分数乘积的分子
    result.down = f1.down * f2.down;//分数乘积的坟墓
    return reduction(result);//返回化简后的结果
}

2.4 分数的除法

对于分数f1和f2,乘法公式为:
r e s u l t = f 1. u p ∗ f 2. d o w n f 1. d o w n ∗ f 2. u p result = \frac{ * }{*} result=f1.downf2.upf1.upf2.down

实现代码如下:

Fraction divide(Fraction f1, Fraction f2){
    Fraction result;
    result.up = f1.up * f2.down;//分数商的分子
    result.down = f1.down * f2.up;//分数商的分母
    return reduction(result);//返回化解后的结果
}
  • 注意:如果读入的除数为0(只需判断是否为0),那么应该直接特判输出语句(例如输出Error、inf等)。只有当除数不为0时,才能用上面的函数进行输出。

3 分数输出

分数的输出根据题目的要求进行,一般有以下几点:

  • 1 分数输出前,需要对其进行化简;
  • 2 如果分数的分母为1,说明分数是整数,一般题目会要求直接输出分子,而省略分母;
  • 3 如果分数r的分子up的绝对值(负分数表示为分子负,分母正)大于分母down,说明该分数是假分数,应该按带分数的形式输出,即整数部分 r . u p / r . d o w n / r.up/r.down,分子部分为$abs()%%,分母部分为;
  • 4 以上都不满足说明分数r是正分数,按原样输出即可。

实现代码:

void showResult(Fraction r){
    if(r.down == 1){//整数
        printf("%lld\n", (long long)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型来存储。

3 完整示例

#include <cstdio>
#include <cstdlib>

struct Fraction
{
    int up;
    int down;
};
//求最大公约数
int gcd(int a, int b){
    return !b ? a : gcd(b, a%b);
}
//化简
Fraction reduction(Fraction result){
    if(result.down < 0){//分母为负,分子分母都变为相反数
        result.up = - result.up;
        result.down = - result.down;
    }

    if(result.up == 0){//如果分子为0,令分母为1
        result.down = 1;
    }else{//分子分母不为0,进行约分
        int d = gcd(abs(result.up), abs(result.down));
        result.up /= d;
        result.down /= d;
    }
    return result;
}

//加法
Fraction add(Fraction f1, Fraction f2){
    Fraction result;
    result.up = f1.up * f2.down + f2.up *  f1.down;//分数和的分子
    result.down = f1.down * f2.down;//分数和的分母
    return reduction(result);//返回化简后的结果
}

//减法
Fraction minu(Fraction f1, Fraction f2){
    Fraction result;
    result.up = f1.up * f2.down - f2.up * f1.down;//分数差的分子
    result.down = f1.down * f2.down;//分数差的分母
    return reduction(result);//返回化简后的结果
}

//乘法
Fraction multi(Fraction f1, Fraction f2){
    Fraction result;
    result.up = f1.up * f2.up;//分数乘积的分子
    result.down = f1.down * f2.down;//分数乘积的坟墓
    return reduction(result);//返回化简后的结果
}

//除法
Fraction divide(Fraction f1, Fraction f2){
    Fraction result;
    result.up = f1.up * f2.down;//分数商的分子
    result.down = f1.down * f2.up;//分数商的分母
    return reduction(result);//返回化解后的结果
}

//输出
void showResult(Fraction r){
    if(r.down == 1){//整数
        printf("%lld\n", (long long)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 main(int argc, char const *argv[])
{
    Fraction f1, f2, res;
    f1.up = 1;
    f1.down = 3;

    f2.up = 1;
    f2.down = 3;

//    res = add(f1, f2);
    res = minu(f1, f2);
//    res = multi(f1,f2);
//      res = divide(f1, f2);
    showResult(res);

    return 0;
}