以前一直老是簡單的想將分數化爲小數進行計算,其實使用相應的結構進行分子分母的分開保存,能夠有奇效;ide
分數的存儲:函數
struct Fraction{ int up; int down; };
其中up表明分子,down表明分母;code
對於分數,有基本的幾個規則:
1.正負號掛在分子上;
2.當分數表示0的時候,分子爲0,分母爲1;
3.分子分母必須達到最簡,也就是沒有1之外的公約數;io
當分數進行四則運算的時候,也是基於這三條的性質來進行化簡;基礎
Fraction reduction(Fraction result){ if(result.down<0){ result.up=-result.up; result.down=-result.down; } if(result.up==0){ result.down=1; }else{ int d=gcd(abs(result.up),abs(result.down)); result.up/=d; result.down/=d; } return result; }
其中值得注意的是進行最大公約數計算的時候必定要注意注意分子可能爲負,因此要進行絕對值的提早處理;gc
分數的四則運算:
在上述化簡函數的基礎上,咱們就能夠根據該規則進行相應的四則運算,四則運算嚴格遵循計算的通分規律;
1.加法運算:程序
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.減法運算:di
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.乘法運算vi
Fraction multi(Fraction f1,Fraction f2){ Fraction result; result.up=f1.up*f2.up; result.down=f2.down*f2.down; return reduction(result); }
4.除法運算:co
Fraction divide(Fraction f1,Fraction f2){ Fraction result; result.up=f1.up*f2.down; result.down=f2.up*f2.down; return reduction(result); }
值得注意的是這裏採用的除法的倒數計算;
分數的輸出形式:
對於一個正常形式的分數,每每有三種形式:
1.整數:此時只輸出分子(因爲程序代碼裏對分子分母進行化簡,因此若是有整數分母必定爲1);
2.真分數:此時按照a/b的格式輸出;
3.假分數:此時應該在按照帶分數的格式輸出,而且符號在前;
代碼以下:
void showResult(Fraction r){ r=reduction(r); if(r.down==1) printf("%lld",r.up); else if(abs(r.up)>r.down){ printf("%d %d/%d",r.up/r.down,abs(r.up)%r.down,r.down); }else{ printf("%d/%d",r.up,r.down); } }
值得注意的是當進行帶分數計算的時候,計算其後真分數餘數的時候,必定要注意abs絕對值得處理;