[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