[C++] 分数的表示


分数表示

1. 分数的定义

定义一个结构体,内含分母和分子两个整型元素。

1 struct F{
2     int up, down;
3 };

2. 特殊情况的规定

  • 当分数为负分数时,我们规定分子为负数,分母为正数。也就是说,当分母为负时,对分子分母同时取反。

  • 当分数为 0 时,我们规定分子为 1,分母为 0。

  • 当分数不是最简式时,求出分子分母的最大公约数d,将分子分母同时除以d得到最简分式。具体步骤见下一节“分数的化简”。

  • 当分数为假分数时(即分子大于分母)

3. 分数的化简

在这里我们实现第二节“特殊情况的规定”中前三点。

F reduction(int up, int down){
    int d = 1;
    F result;
    
    // 分母小于 0,分子分母同时取反
    if(down < 0){ 
        up = -up;
        down = -down;
    }
    
    // 分式等于 0,使分母为 1
    if(up == 0){
        down = 1;
    }else{
        // 求出分子分母的最大公约数
        if(up > down){
            d = gcd(up, down);
        }else{
            d = gcd(down, up);
        }
    }
    
    // 将分子分母除以他们的最大公约数,得到最简分式
    result.up = up / d, result.down = down / d;
    
    return result;
}

4. 分式的四则运算

这个其实很简单,只需要模拟我们平时生活中计算分式的方法即可。需要注意一点是两个分式计算完毕之后需要化简为最简分式。这里我只实现两个分式的加运算,其余三个懒不想写可以留作练习。

F add(F a, F b){
    // 设两个分式 A = a/b 和 B = c/d,那么 
    // A + B = (a * d + b * c) / b * d
    // 也就是先通分,然后分子相加,注意这一步我们把计算结果化为最简分式了
    return reduction(a.up * b.down + b.up * a.down, a.down * b.down);
}

5. 分式的输出

需要分以下几种情况讨论:

  1. 分母为一,也就是为整数的情况,一般只需要输出分子

  2. 假分数(分子大于分母),多出来的一部分整数为分子/分母,原分式的分子变为 abs(分子 % 分母),分母不变

  3. 真分数,直接输出即可

看代码:

void print_fraction(F f){
    if(f.down == 1){ // 整数
        printf("%d\n", f.up);
    }else if(f.up > f.down){ // 假分数
        printf("%d %d/%d\n", f.up / f.down, abs(f.up % f.down), f.down);
    }else{ // 真分数
        printf("%d/%d\n", f.up, f.down);
    }
}

总结

表示分数的思想很简单,就是模拟现实生活中的分数表示方法。

附上全部代码:

#include <cstdio>
#include <cmath>

using namespace std;

struct Fraction{
    int up, down;
};

int gcd(int a, int b){
    return !b ? a : gcd(b, a % b);
}

Fraction get_fraction(int up, int down){
    int d = 1;
    Fraction res;
    
    if(down < 0){
        down = -down;
        up = - up;
    }
    
    if(up == 0){
        down = 1;
    }else{
        if(up > down){
            d = gcd(up, down);
        }else{
            d = gcd(down, up);
        }
    }
    
    res.up = up / d, res.down = down / d;
    
    return res;
}

Fraction add(Fraction a, Fraction b){
    return get_fraction(a.up * b.down + b.up * a.down, a.down * b.down);
}

Fraction sub(Fraction a, Fraction b){
    return get_fraction(a.up * b.down - b.up * a.down, a.down * b.down);
}

Fraction mul(Fraction a, Fraction b){
    return get_fraction(a.up * b.up, a.down * b.down);
}

Fraction div(Fraction a, Fraction b){
    return get_fraction(a.up * b.down, a.down * b.up);
}

void prt_fraction(Fraction f){
    if(f.down == 1){
        printf("%d\n", f.up);
    }else if(f.up > f.down){
        printf("%d %d/%d\n", f.up / f.down, abs(f.up % f.down), f.down);
    }else{
        printf("%d/%d\n", f.up, f.down);
    }
}

int main(){
    Fraction a, b;
    a = get_fraction(12, 24), b= get_fraction(5, 12);
    
    prt_fraction(add(a, b));
    prt_fraction(sub(a, b));
    prt_fraction(mul(a, b));
    prt_fraction(div(a, b));
    
    return 0;
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM