1. 分數的定義
定義一個結構體,內含分母和分子兩個整型元素。
1 struct F{ 2 int up, down; 3 };
2. 特殊情況的規定
-
當分數為負分數時,我們規定分子為負數,分母為正數。也就是說,當分母為負時,對分子分母同時取反。
-
當分數為 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. 分式的輸出
需要分以下幾種情況討論:
-
分母為一,也就是為整數的情況,一般只需要輸出分子
-
假分數(分子大於分母),多出來的一部分整數為
分子/分母
,原分式的分子變為 abs(分子 % 分母),分母不變 -
真分數,直接輸出即可
看代碼:
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; }