這種問題主要是化簡和規範問題,沒有啥技巧性。通過一個結構體數組來表示一個分數:
分數表示
struct Fraction{
long long up,down;
}
注意事項
需要注意的是下面三個規則:
-
分子down大於零。若分數爲負數,則令分子和分母都取相反數。
-
若分數爲0,這令分子up爲0,分母down爲1。
-
分子和分母都沒有除了1之外的公約數。
代碼實現
寫一遍代碼熟悉一下:
#include<cstdio>
#include<cmath>
typedef long long ll;
struct Fraction{
ll up,down;
};
//求最大公約數
ll gcd(ll a, ll b){
if(b==0)return a;
else return gcd(b,a%b);
}
//化簡操作
Fraction reduction(Fraction result){
if(a.down < 0){
result.up = -result.up;
result.down = -result.down;
}
if(result.up == 0){
result.down = 1;
}else{
ll d = gcd(abs(result.up),abs(result.down));
result.up /= d;
result.down /= d;
}
return result;
}
//加法
Fraction add(Fraction a, Fraction b){
Fraction result;
result.up = a.up*b.down + a.down*a.up;
result.down = a.down * b.down;
return reduction(result);
}
//減法
Fraction minu(Fraction a, Fraction b){
Fraction result;
result.up = a.up*b.down - a.down*b.up;
result.down = a.down*b.down;
return reduction(result);
}
//乘法
Fraction multi(Fraction a , Fraction b){
Fraction result;
result.up = a.up*b.up;
result.down = a.down*b.down;
return reduction(result);
}
//除法
Fraction div(Fraction a, Fraction b){
Fraction result;
result.up = a.up*b.down;
result.down = a.down*b.up;
return reduction(result);
}
//打印
void showResult(Fraction r){
r = reduction(r);
if(r.down == 1)printf("%lld",r.up);
else{
if(abs(r.up)>abs(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);
}
}
}
注意到除法的時候可能在輸入的時候需要判斷除數是否爲0。